contract Token is ERC20Detailed, ERC20Pausable, ERC20Burnable, ERC20Mintable {
    // per-user timelock
    mapping (address => uint256) lockedUntil;

    constructor()
    ERC20Detailed("PAY", "PCL", 18)
    ERC20Pausable()
    ERC20Burnable()
    ERC20Mintable()
    public {
    }

    // per-user timelock
    modifier unLocked() {
        require(block.timestamp >= lockedUntil[msg.sender], 'timelocked');
        _;
    }

    // Overrides
    function transfer(address to, uint256 value) public unLocked returns (bool) {
        return super.transfer(to, value);
    }

    // Overrides
    function transferFrom(address from, address to, uint256 value) public unLocked returns (bool) {
        return super.transferFrom(from, to, value);
    }

    function mintWithTimelock(address to, uint256 value, uint256 releaseTime) public {
        super.mint(to, value);
        lockedUntil[to] = releaseTime;
    }

    function timelockOf(address owner) public view returns (uint256) {
        return lockedUntil[owner];
    }
}
function transfer(address to, uint256 value) public unLocked returns (bool) {
    return super.transfer(to, value);
}

// Overrides