The cause is the variable name confusion. It is true that each `DynamicModule` creates different symbol names. However, a new symbol name is generated again in `Dynamic`. For example, try running this code and slide the slider: DynamicModule[{x = 0, f}, f[] := Print[SymbolName@f]; f[]; Slider[Dynamic[x, f[] &]]] (* f$400707 *) (* Slider *) (* f$$3152 *) `f$$3152` is printed when you move the slider. Using OP's code construction + some modifications: ClearAll[inner, outer]; inner[Dynamic[x_, args___]] := DynamicModule[{update}, update[] := (Print@update; Print@args); update[]; Slider[Dynamic[x, update[] &]]]; outer[Dynamic[x_, args___]] := DynamicModule[{update}, update[] := (Print@update); update[]; {Slider[Dynamic[x, update[] &]], inner[Dynamic[x, update[] &]]}]; x = 1; outer[Dynamic@x] (* update$405810 *) (* update$405811 *) (* update$405810[] & *) (* 2 Sliders *) (* FE`update$$3176 *) (* FE`update$$3177 *) (* FE`update$$3177[] & *) The `3176` is printed when you move the first slider (`outer`). The two `3177`s are printed when you move the second slider (`inner`). The first three lines of output is the expected behavior (`args` refers to `update` in `outer (405810)` not `inner (405811)`), which is correct, but the last three lines are the actual behavior (`args` refers to `update` in `inner (3177)` not `outer (3176)`). This creates name confusion as I stated in the first comment, causing _Mathematica_ to use the definition of `update` defined by `inner` for all instances of `update`.