Here what is going on, `aTestFunction` was created in ``aPackage` `` context, then you've removed it and since the current context is ``Private` `` the definition is created for that symbol. New symbols are created in current `$Context` during read time, `::usage` line makes `aTestFunction` an exported symbol. After `Remove` it's no longer there and your definition is read in ``Private` `` context. BeginPackage["aPackage`"]; aTestFunction::usage = "aTestFunction usage"; (*1*) Begin["`Private`"]; Remove[aTestFunction]; (*2*) aTestFunction[arg_] := arg + 1; (*3*) Protect[aTestFunction]; End[]; EndPackage; ---------- ?aTestFunction > Information::notfound: Symbol aTestFunction not found. >> ---------- ?aPackage`Private`aTestFunction [![enter image description here][1]][1] [1]: https://i.sstatic.net/vcY1N.png