diff --git a/include/ftl/protocol/channels.hpp b/include/ftl/protocol/channels.hpp
index e4bf601bdbc248c4f80d335f29b9e9ac9e041f3d..1ab1bee713ea939cde2c8bb9ca78f829f3cc24d1 100644
--- a/include/ftl/protocol/channels.hpp
+++ b/include/ftl/protocol/channels.hpp
@@ -15,124 +15,184 @@ namespace protocol {
 enum struct Channel : int {
     /* Video Channels */
     kNone           = -1,
-    kColour         = 0,    // 8UC3 or 8UC4
+    kColour         = 0,    /// Left-eye colour video
     kLeft           = 0,
-    kDepth          = 1,    // 32S or 32F
-    kRight          = 2,    // 8UC3 or 8UC4
+    kDepth          = 1,    /// Left-eye depth
+    kRight          = 2,    /// Right-eye colour video
     kColour2        = 2,
-    kDepth2         = 3,
+    kDepth2         = 3,    /// Right-eye depth
     kDeviation      = 4,
-    kScreen         = 4,    // 16SC2
-    kNormals        = 5,    // 16FC4
-    kWeights        = 6,    // short
-    kConfidence     = 7,    // 32F
-    kContribution   = 7,    // 32F
-    kEnergyVector   = 8,    // 32FC4
-    kFlow           = 9,    // 16SC2
-    kFlow2          = 10,   // 16SC2
-    kEnergy         = 10,   // 32F
-    kMask           = 11,   // 32U
-    kDensity        = 12,   // 32F
-    kSupport1       = 13,   // 8UC4 (currently)
-    kSupport2       = 14,   // 8UC4 (currently)
-    kSegmentation   = 15,   // 32S?
-    kNormals2       = 16,   // 16FC4
+    kScreen         = 4,
+    kNormals        = 5,    /// Normals for left-eye
+    kWeights        = 6,    /// Per pixel weighting
+    kConfidence     = 7,    /// Depth or disparity confidence
+    kContribution   = 7,
+    kEnergyVector   = 8,
+    kFlow           = 9,    /// Optical flow
+    kFlow2          = 10,   /// Right optical flow
+    kEnergy         = 10,   /// Some energy measure
+    kMask           = 11,   /// Pixel masking
+    kDensity        = 12,   /// Point density
+    kSupport1       = 13,   /// Cross support coordinates
+    kSupport2       = 14,
+    kSegmentation   = 15,   /// Segment identifiers
+    kNormals2       = 16,   /// Right-eye normals
     kUNUSED1        = 17,
-    kDisparity      = 18,
-    kSmoothing      = 19,   // 32F
+    kDisparity      = 18,   /// Original disparity
+    kSmoothing      = 19,   /// Smoothing magnitude
     kUNUSED2        = 20,
-    kOverlay        = 21,   // 8UC4
-    kGroundTruth    = 22,   // 32F
+    kOverlay        = 21,   /// Colour overlay image
+    kGroundTruth    = 22,   /// Ground truth
 
     /* Audio Channels */
-    kAudioMono      = 32,   // Deprecated, will always be stereo
+    kAudioMono      = 32,
     kAudioStereo    = 33,
-    kAudio          = 33,
+    kAudio          = 33,   /// Stereo audio data
 
     /* Special data channels */
-    kConfiguration    = 64,   // JSON Data
+    kConfiguration    = 64,   /// Device URI list
     kSettings1        = 65,
-    kCalibration      = 65,   // Camera Parameters Object
-    kPose             = 66,   // Eigen::Matrix4d, camera transform
+    kCalibration      = 65,   /// Camera Parameters Object
+    kPose             = 66,   /// Eigen::Matrix4d, camera transform
     kSettings2        = 67,
-    kCalibration2     = 67,   // Right camera parameters
+    kCalibration2     = 67,   /// Right camera parameters
     kIndex            = 68,
-    kControl          = 69,   // For stream and encoder control
+    kControl          = 69,   /// For stream and encoder control
     kSettings3        = 70,
-    kMetaData         = 71,   // Map of string pairs (key, value)
-    kCapabilities     = 72,   // Unordered set of int capabilities
-    kCalibrationData  = 73,  // Just for stereo intrinsics/extrinsics etc
-    kThumbnail        = 74,   // Small JPG thumbnail, sometimes updated
-    kOverlaySelect    = 75,   // Choose what to have in the overlay channel
-    kStartTime        = 76,   // Stream start timestamp
-    kUser             = 77,   // User currently controlling the stream
-
-    kAccelerometer    = 90,   // Eigen::Vector3f
-    kGyroscope        = 91,   // Eigen::Vector3f
+    kMetaData         = 71,   /// Map of string pairs (key, value)
+    kCapabilities     = 72,   /// Unordered set of int capabilities
+    kCalibrationData  = 73,   /// Just for stereo intrinsics/extrinsics etc
+    kThumbnail        = 74,   /// Small JPG thumbnail, sometimes updated
+    kOverlaySelect    = 75,   /// Choose what to have in the overlay channel
+    kStartTime        = 76,   /// Stream start timestamp
+    kUser             = 77,   /// User currently controlling the stream
+    kName             = 78,   /// Alternative to meta data channel
+    kTags             = 79,   /// Array of string tag names
+    KDescription      = 80,
+    kSelectPoint      = 81,   /// A selected X,Y screen point
+
+    kAccelerometer    = 90,   /// Eigen::Vector3f
+    kGyroscope        = 91,   /// Eigen::Vector3f
 
     /* Camera Options */
-    kBrightness          = 100,
-    kContrast            = 101,
-    kExposure            = 102,
-    kGain                = 103,
-    kWhiteBalance        = 104,
-    kAutoExposure        = 105,
-    kAutoWhiteBalance    = 106,
-    kCameraTemperature   = 107,
+    kBrightness          = 100,     /// Camera brightness setting
+    kContrast            = 101,     /// Camera contrast setting
+    kExposure            = 102,     /// Camera exposure setting
+    kGain                = 103,     /// Camera gain setting
+    kWhiteBalance        = 104,     /// Camera white balance setting
+    kAutoExposure        = 105,     /// Camera auto exposure enabled
+    kAutoWhiteBalance    = 106,     /// Camera auto white balance enabled
+    kCameraTemperature   = 107,     /// Current camera temperature reading
 
     /* Realsense Options */
-    kRS2_LaserPower       = 150,
-    kRS2_MinDistance      = 151,
-    kRS2_MaxDistance      = 152,
-    kRS2_InterCamSync     = 153,
-    kRS2_PostSharpening   = 154,
+    kRS2_LaserPower       = 150,    /// RealSense laser power
+    kRS2_MinDistance      = 151,    /// RealSense minimum depth
+    kRS2_MaxDistance      = 152,    /// RealSense maximum depth
+    kRS2_InterCamSync     = 153,    /// RealSense inter-camera sync mode
+    kRS2_PostSharpening   = 154,    /// RealSense post sharpening filter
 
     /* Pylon Options 200 */
 
     /* Audio Settings 300 */
 
     /* Renderer Settings 400 */
-    kRenderer_CameraType          = 400,  // stereo, normal, tile
-    kRenderer_Visualisation       = 401,  // Pointcloud, mesh, other
-    kRenderer_Engine              = 402,  // OpenGL, CUDA, other
-    kRenderer_FPS                 = 403,  // Frames per second
-    kRenderer_View                = 404,  // Fixed viewpoint to one source
-    kRenderer_Channel             = 405,  // Select overlay channel,
-    kRenderer_Opacity             = 406,  // Opacity of overlay channel
-    kRenderer_Sources             = 407,  // Which source devices to use
-    kRenderer_Projection          = 408,  // 0 = normal, 1 = ortho, 2 = equirect
-    kRenderer_Background          = 409,  // Background colour
-    kRenderer_ShowBadColour       = 420,
-    kRenderer_CoolEffect          = 421,
-    kRenderer_EffectColour        = 422,
-    kRenderer_ShowColourWeights   = 423,
-    kRenderer_TriangleLimit       = 424,
-    kRenderer_DisconDisparities   = 425,
-    kRenderer_NormalWeightColour  = 426,
-    kRenderer_ChannelWeights      = 427,
-    kRenderer_AccumFunc           = 428,
+    kRenderer_CameraType            = 400,  // stereo, normal, tile
+    kRenderer_Visualisation         = 401,  // Pointcloud, mesh, other
+    kRenderer_Engine                = 402,  // OpenGL, CUDA, other
+    kRenderer_FPS                   = 403,  // Frames per second
+    kRenderer_View                  = 404,  // Fixed viewpoint to one source
+    kRenderer_Channel               = 405,  // Select overlay channel,
+    kRenderer_Opacity               = 406,  // Opacity of overlay channel
+    kRenderer_Sources               = 407,  // Which source devices to use
+    kRenderer_Projection            = 408,  // 0 = normal, 1 = ortho, 2 = equirect
+    kRenderer_Background            = 409,  // Background colour
+    kRenderer_ShowBadColour         = 420,
+    kRenderer_CoolEffect            = 421,
+    kRenderer_EffectColour          = 422,
+    kRenderer_ShowColourWeights     = 423,
+    kRenderer_TriangleLimit         = 424,
+    kRenderer_DisconDisparities     = 425,
+    kRenderer_NormalWeightColour    = 426,
+    kRenderer_ChannelWeights        = 427,
+    kRenderer_AccumFunc             = 428,
+    kRenderer_Lights                = 429,
+    kRenderer_Debug                 = 430,  // Depends on the renderer engine
 
     /* Pipeline Settings */
-    kPipeline_Enable          = 500,
-    kPipeline_EnableMVMLS     = 501,
-    kPipeline_EnableAruco     = 502,
+    kOperators                      = 500,
+
+    /* Clipping */
+    kClip_Box                       = 510,
+    kClip_Enabled                   = 511,
+    kClip_Colour                    = 512,
+
+    /* Fusion operator */
+    kFusion_Smoothing               = 520,
+    kFusion_Iterations              = 521,
+    kFusion_Carving                 = 522,
+    kFusion_ShowChanges             = 523,
+
+    /* MVMLS Operator */
+    kMLS_DisconPixels               = 540,
+    kMLS_ColourSmoothing            = 541,
+    kMLS_Iterations                 = 542,
+    kMLS_Radius                     = 543,
+    kMLS_WindowSize                 = 544,
+    kMLS_MergeCorresponding         = 545,
+    kMLS_Merge                      = 546,
+    kMLS_ConfidenceCull             = 547,
+    kMLS_ColourSmooth2              = 548,
+    kMLS_SpatialSmooth              = 549,
+    kMLS_SubPixel                   = 550,
+    kMLS_P1                         = 551,
+    kMLS_P2                         = 552,
+    kMLS_ShowConsistency            = 553,
+    kMLS_ShowAdjustment             = 554,
+
+    /* Masking operator */
+    kMask_DisconPixels              = 560,
+    kMask_DisconThreshold           = 561,
+    kMask_NoiseThreshold            = 562,
+    kMask_AreaMax                   = 563,
+    kMask_BorderRect                = 564,
+    kMask_MaskID                    = 565,
+    kMask_Radius                    = 566,
+    kMask_Invert                    = 570,
+
+    /* Aruco Operator */
+    kAruco_Dictionary               = 580,
+    kAruco_EstimatePose             = 581,
+    kAruco_MarkerSize               = 582,
+
+    /* Poser operator */
+    kPoser_Identity                 = 590,
+    kPoser_Locked                   = 591,
+    kPoser_Inverse                  = 592,
 
     /* Stereo video settings */
-    kSGMResolution              = 600,
-    kStereoRectify              = 601,
-    kStereoRightPose            = 602,
-    kStereoRectifyCubic         = 603,
-    kVideoOffsetZ               = 604,
-    kVideoSize                  = 605,
-
-    /* Sender settings */
-    kSenderLosslessFloat        = 700,
-    kSenderLosslessColour       = 701,
-    kSenderIFrames              = 702,
-    kSenderCodecFloat           = 703,
-    kSenderCodecColour          = 704,
-    kSenderMaxBitrate           = 705,
-    kSenderFloatBitrateScale    = 706,
+    kSGMResolution                  = 600,
+    kStereoRectify                  = 601,
+    kStereoRightPose                = 602,
+    kStereoRectifyCubic             = 603,
+    kVideoOffsetZ                   = 604,
+    kVideoSize                      = 605,
+
+    /* Pixel weights operator */
+    kWeights_DisconPixels           = 610,
+    kWeights_DisconThreshold        = 611,
+    kWeights_NoiseThreshold         = 612,
+    kWeights_AreaMax                = 613,
+    kWeights_UseDepth               = 614,
+    kWeights_UseColour              = 615,
+    kWeights_UseNoise               = 616,
+    kWeights_UseNormals             = 617,
+
+    /* Cross support operator */
+    kCross_UseDiscontinuity         = 620,
+    kCross_VMax                     = 621,
+    kCross_HMax                     = 622,
+    kCross_Symmetric                = 623,
+    kCross_Tau                      = 624,
 
 
     /* Custom / user data channels */
diff --git a/src/channelUtils.cpp b/src/channelUtils.cpp
index 50dabb76826a38485a6934dabf0ecb7e43a18095..d0e343cecfc8681a6d0a99393885d0cf811826fe 100644
--- a/src/channelUtils.cpp
+++ b/src/channelUtils.cpp
@@ -124,6 +124,10 @@ static const std::unordered_map<Channel,ChannelInfo> info = {
     {Channel::kOverlaySelect,       {"OverlaySelect",       -1}},
     {Channel::kStartTime,           {"StartTime",           -1}},
     {Channel::kUser,                {"User",                -1}},
+    {Channel::kName,                {"Name",                -1}},
+    {Channel::kTags,                {"Tags",                -1}},
+    {Channel::KDescription,         {"Decription",          -1}},
+    {Channel::kSelectPoint,         {"SelectPoint",         -1}},
 
     {Channel::kBrightness,          {"Brightness",          -1}},
     {Channel::kContrast,            {"Contrast",            -1}},
@@ -159,21 +163,74 @@ static const std::unordered_map<Channel,ChannelInfo> info = {
     {Channel::kRenderer_NormalWeightColour,     {"RenderNormalWeightColour",    -1}},
     {Channel::kRenderer_ChannelWeights,         {"RenderChannelWeights",        -1}},
     {Channel::kRenderer_AccumFunc,              {"RenderAccumFunc",             -1}},
+    {Channel::kRenderer_Lights,                 {"RenderLights",                -1}},
+    {Channel::kRenderer_Debug,                  {"RenderDebug",                 -1}},
 
-    {Channel::kSGMResolution,       {"SGMResolution",       -1}},
-    {Channel::kStereoRectify,       {"StereoRectify",       -1}},
-    {Channel::kStereoRightPose,     {"StereoRightPose",     -1}},
-    {Channel::kStereoRectifyCubic,  {"StereoRectifyCubic",  -1}},
-    {Channel::kVideoOffsetZ,        {"VideoOffsetZ",        -1}},
-    {Channel::kVideoSize,           {"VideoSize",           -1}},
-
-    {Channel::kSenderLosslessFloat,     {"SenderLosslessFloat",     -1}},
-    {Channel::kSenderLosslessColour,    {"SenderLosslessColour",    -1}},
-    {Channel::kSenderIFrames,           {"SenderIFrames",           -1}},
-    {Channel::kSenderCodecFloat,        {"SenderCodecFloat",        -1}},
-    {Channel::kSenderCodecColour,       {"SenderCodecColour",       -1}},
-    {Channel::kSenderMaxBitrate,        {"SenderMaxBitrate",        -1}},
-    {Channel::kSenderFloatBitrateScale, {"SenderFloatBitrateScale", -1}},
+    {Channel::kOperators,                   {"Operators",               -1}},
+
+    {Channel::kClip_Box,                    {"ClipBox",                 -1}},
+    {Channel::kClip_Enabled,                {"ClipEnabled",             -1}},
+    {Channel::kClip_Colour,                 {"ClipColour",              -1}},
+
+    {Channel::kFusion_Smoothing,            {"FusionSmoothing",         -1}},
+    {Channel::kFusion_Iterations,           {"FusionIterations",        -1}},
+    {Channel::kFusion_Carving,              {"FusionCarving",           -1}},
+    {Channel::kFusion_ShowChanges,          {"FusionShowChanges",       -1}},
+
+    {Channel::kMLS_DisconPixels,            {"MLSDisconPixels",         -1}},
+    {Channel::kMLS_ColourSmoothing,         {"MLSColourSmoothing",      -1}},
+    {Channel::kMLS_Iterations,              {"MLSIterations",           -1}},
+    {Channel::kMLS_Radius,                  {"MLSRadius",               -1}},
+    {Channel::kMLS_WindowSize,              {"MLSWindowSize",           -1}},
+    {Channel::kMLS_MergeCorresponding,      {"MLSMergeCorresponding",   -1}},
+    {Channel::kMLS_Merge,                   {"MLSMerge",                -1}},
+    {Channel::kMLS_ConfidenceCull,          {"MLSConfidenceCull",       -1}},
+    {Channel::kMLS_ColourSmooth2,           {"MLSColourSmooth2",        -1}},
+    {Channel::kMLS_SpatialSmooth,           {"MLSSpatialSmooth",        -1}},
+    {Channel::kMLS_SubPixel,                {"MLSSubPixel",             -1}},
+    {Channel::kMLS_P1,                      {"MLSP1",                   -1}},
+    {Channel::kMLS_P2,                      {"MLSP2",                   -1}},
+    {Channel::kMLS_ShowConsistency,         {"MLSShowConsistency",      -1}},
+    {Channel::kMLS_ShowAdjustment,          {"MLSShowAdjustment",       -1}},
+
+    {Channel::kMask_DisconPixels,           {"MaskDisconPixels",        -1}},
+    {Channel::kMask_DisconThreshold,        {"MaskDisconThreshold",     -1}},
+    {Channel::kMask_NoiseThreshold,         {"MaskNoiseThreshold",      -1}},
+    {Channel::kMask_AreaMax,                {"MaskAreaMax",             -1}},
+    {Channel::kMask_BorderRect,             {"MaskBorderRectangle",     -1}},
+    {Channel::kMask_MaskID,                 {"MaskID",                  -1}},
+    {Channel::kMask_Radius,                 {"MaskRadius",              -1}},
+    {Channel::kMask_Invert,                 {"MaskInvert",              -1}},
+
+    {Channel::kAruco_Dictionary,            {"ArucoDictionary",         -1}},
+    {Channel::kAruco_EstimatePose,          {"ArucoEstimatePose",       -1}},
+    {Channel::kAruco_MarkerSize,            {"ArucoMarkerSize",         -1}},
+
+    {Channel::kPoser_Identity,              {"PoserIdentity",           -1}},
+    {Channel::kPoser_Locked,                {"PoserLocked",             -1}},
+    {Channel::kPoser_Inverse,               {"PoserInverse",            -1}},
+
+    {Channel::kSGMResolution,               {"SGMResolution",           -1}},
+    {Channel::kStereoRectify,               {"StereoRectify",           -1}},
+    {Channel::kStereoRightPose,             {"StereoRightPose",         -1}},
+    {Channel::kStereoRectifyCubic,          {"StereoRectifyCubic",      -1}},
+    {Channel::kVideoOffsetZ,                {"VideoOffsetZ",            -1}},
+    {Channel::kVideoSize,                   {"VideoSize",               -1}},
+
+    {Channel::kWeights_DisconPixels,        {"WeightsDisconPixels",     -1}},
+    {Channel::kWeights_DisconThreshold,     {"WeightsDisconThreshold",  -1}},
+    {Channel::kWeights_NoiseThreshold,      {"WeightsNoiseThreshold",   -1}},
+    {Channel::kWeights_AreaMax,             {"WeightsAreaMax",          -1}},
+    {Channel::kWeights_UseDepth,            {"WeightsUseDepth",         -1}},
+    {Channel::kWeights_UseColour,           {"WeightsUseColour",        -1}},
+    {Channel::kWeights_UseNoise,            {"WeightsUseNoise",         -1}},
+    {Channel::kWeights_UseNormals,          {"WeightsUseNormals",       -1}},
+
+    {Channel::kCross_UseDiscontinuity,      {"CrossUseDiscontinuity",   -1}},
+    {Channel::kCross_VMax,                  {"CrossVMax",               -1}},
+    {Channel::kCross_HMax,                  {"CrossHMax",               -1}},
+    {Channel::kCross_Symmetric,             {"CrossSymmetric",          -1}},
+    {Channel::kCross_Tau,                   {"CrossTau",                -1}},
 
     {Channel::kData,                {"Generic Data",        -1}},
     {Channel::kFaces,               {"Faces",               -1}},