contract IssuableToken is StandardToken, Ownable, Pausable {

    event Mint(address indexed to, uint256 amount);
    event IssuerAdded(address indexed newIssuer);
    event IssuerRemoved(address indexed removedIssuer);

    mapping (address => bool) public issuers;

    modifier onlyIssuer() {
        require(issuers[msg.sender]);
        _;
    }

    /**
     * @dev Authorize an issuer
     */
    function addIssuer(address newIssuer) onlyOwner public {
        issuers[newIssuer] = true;
        emit IssuerAdded(newIssuer);
    }

    /**
     * @dev Deauthorize an issuer
     */
    function removeIssuer(address removedIssuer) public onlyOwner {
        issuers[removedIssuer] = false;
        emit IssuerRemoved(removedIssuer);
    }

    /**
     * @dev Function to issue tokens to an address
     * @param _to The address that will receive the minted tokens.
     * @param _amount The amount of tokens to mint.
     * @return A boolean that indicates if the operation was successful.
     */
    function issueTo(address _to, uint256 _amount) public onlyIssuer whenNotPaused returns (bool) {
        totalSupply_ = totalSupply_.add(_amount);
        balances[_to] = balances[_to].add(_amount);
        emit Mint(_to, _amount);
        emit Transfer(address(0), _to, _amount);
        return true;
    }

    /**
     * @dev Function to issue tokens to the caller
     */
    function issue(uint256 _amount) public onlyIssuer whenNotPaused returns (bool) {
        issueTo(msg.sender, _amount);
        return true;
    }

}
/**
 * @title Issuable token
 */
function removeIssuer(address removedIssuer) public onlyOwner {
    issuers[removedIssuer] = false;
    emit IssuerRemoved(removedIssuer);
}

/**
 * @dev Deauthorize an issuer
 */