2) Include the field in the READ path (Query‑based DS) If the form data source uses a Query, add the selection via CoC on the DS init(): // RouteInventProd – ensure the DS name below matches the actual base table DS on your form [ExtensionOf(formDataSourceStr(RouteInventProd, ProdRouteTable))] // <-- adjust DS name if different final class RouteInventProdProdRouteTableDSInitExt {     public void init()     {         next init();         // Ensure the query selects the new field so it returns on refresh         Query q = this.query();         if (q)         {             QueryBuildDataSource qbds = q.dataSourceTable(tableNum(ProdRouteTable));             if (qbds)             {                 // Add the needed field to selection (for dynamic queries or to guarantee presence)                 qbds.addSelectionField(fieldNum(ProdRouteTable, MyNewField));             }         }     } If your DS uses a static Query (Fields node), add MyNewField there in metadata, or keep the CoC above to guarantee selection. 3) Persist in the WRITE path (FormDataSource.write via CoC) Use CoC on the base table DS and call next write() (no event‑handler super()): // RouteInventProd – base table DS write path [ExtensionOf(formDataSourceStr(RouteInventProd, ProdRouteTable))] // <-- adjust DS name if different final class RouteInventProdProdRouteTableDSWriteExt {     public void write()     {         // Active buffer of the base table DS         ProdRouteTable prodRoute = ProdRouteTableds.cursor();         // If the control is bound to DataField=MyNewField, the buffer is typically updated already.         // Keeping an explicit assignment is safe and makes the intent clear.         prodRoute.MyNewField = ProdRouteTableMyNewField.value();         next write(); // persist via kernel     } 4) If the form uses TempDB/InMemory in its read flow Some forms load rows into a Tmp DS and only copy known fields back to the real table.\ In that case, read from Tmp/UI and set the real table buffer before next write(): // CoC on the REAL table DS (not the Tmp DS) [ExtensionOf(formDataSourceStr(RouteInventProd, ProdRouteTable))] final class RouteInventProdProdRouteTableDSWriteFromTmpExt {     public void write()     {         ProdRouteTable prodRoute = ProdRouteTableds.cursor();         // Example: copy from your Tmp DS control or buffer         // Replace RouteInventProdTmpMyNewField with the actual Tmp control/buffer field name         prodRoute.MyNewField = RouteInventProdTmpMyNewField.value();         next write();     } The critical point: write through the real table DS.\ Updating only a Tmp DS means a refresh will reload without your value.