I know there is a 25% stagger for difficulty going up - is there one for going down?
I'm not sure of the meaning of "stagger" but the difficulty change is limited to a factor of 4 during any retarget. I believe this is the relevant code:
57 // Limit adjustment step
58 int64_t nActualTimespan = pindexLast->GetBlockTime() - nFirstBlockTime;
59 if (nActualTimespan < params.nPowTargetTimespan/4)
60 nActualTimespan = params.nPowTargetTimespan/4;
61 if (nActualTimespan > params.nPowTargetTimespan*4)
62 nActualTimespan = params.nPowTargetTimespan*4;
63
64 // Retarget
65 const arith_uint256 bnPowLimit = UintToArith256(params.powLimit);
66 arith_uint256 bnNew;
67 ...
So it compares the time take for the last 2016 blocks to one-quarter and four times the desired timespan for 2016 blocks (which I think is 1209600 seconds) and if it is greater than 4838400 or less than 302400 the timespan is set to one of those values accordingly and used to calculate the new difficulty.