Andreas,
 
> > 
 > > \tlp_new:N \l_tmp_tlp
 >   ^^^^^^^^^^
 > ;-)
 > I am doing this mistake frequently. But there is only a
 > \tlp_clear_new:N. Maybe there really should exist a \tlp_new:N.

hm yes, it is somewhat inconsistent to have the tlp initialisation to take a
default value while normally that isn't the case.

have added \tlp_new:N  (which is equiv to \tlp_new:Nn #1 {} )

 > > \prop_new:N \g_foo_prop
 > > 
 > > \tlp_set:Nn \l_tmp_tlp {\g_foo_prop}
 > > 
 > > \prop_gput:Ooo \l_tmp_tlp ...
 > 
 > 
 > Hmm... But this could be done with \prop_gput:Noo as well.

that could only be done if you know that \prop_gput:Noo expand its argument
internally due to its implementation and you use this fact. so you use a
feature of the implementation which may not be there tomorrow

just assume for a moment we would built in checks for variables to be checked
for type or local global state then passing "\l_tmp_tlp" would fail on both
accounts (not that i propose that)

cheers
frank