So, the method of having a _start() and _stop() function for each element just doesn't scale. In the case of pipeline/thread model with a PLAYING state bit, I have no way of passing a state change all the way down the graph, i.e. a thread sitting inside a supplied bin. Proposal is to have a single state-change class function, which gets passed a single argument (no more 'state' going along with RUNNING). This function can be overridden by each element as necessary, but must chain to the parent_class version of it. It does its work, just like [st]et_arg, in a case. It checks for STATE and ~STATE, and does the appropriate steps. All the _start() and _stop() functions get moved into this one, in the GST_STATE_RUNNING and ~GST_STATE_RUNNING cases. This allows bins to and derivations thereof to simply pass through any state they don't understand. Meta-elements will also pass through. There may need to be some mechanism that provides for setting state on only a certain type. This can be provided as an alternate path supplied by bins. The bin is the one that would do the work in any case. Simply provide class function for bins that does the selective stuff, and a main _bin_ function that calls this class function. The supplied class function for each bin would simply check against the given GtkType before setting its state. Derivations of GstBin would always get it. Success chaining (gbooleans) starts to get a little hairier... Functions: gst_element_set_state(element,state) is called by the application to set the state for an element (or bin). elementclass->change_state() is the class function that actually does the setting of the state for this element. Any subclass implementation will chain to the parent_class's version. gst_element_change_state(element,state) is the Element class's implementation of the change_state() function. It simply sets the state. gst_bin_set_state_type(element,state,type) is a specialized function for bins only that sets the type only on elements of that type. binclass->change_state_type() is the class function that does the selective