contract VouchCoin is Ownable, ERC20Interface {
  using SafeMath for uint;

  uint public _totalSupply = 10000000000000000;
  string public constant name = "VouchCoin";
  string public constant symbol = "VHC";
  uint public constant decimals = 8;
  string public standard = "VouchCoin token v2.0";

  mapping (address => uint) balances;
  mapping (address => mapping (address => uint)) allowances;

  event Burn(address indexed _from, uint _value);

  // Constructor
  function VouchCoin() public {
    balances[owner] = _totalSupply;
    emit Transfer(address(0), owner, _totalSupply);
  }

  // Total supply
  function totalSupply() public constant returns (uint _supply) {
    return _totalSupply;
  }

  // Get the token balance of address
  function balanceOf(address _owner) public constant returns (uint balance) {
    return balances[_owner];
  }

  // Transfer tokens from owner address
  function transfer(address _to, uint _value) public returns (bool success) {
    require(_to != 0x0);

    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    emit Transfer(msg.sender, _to, _value);
    return true;
  }

  function approve(address _spender, uint _value) public returns(bool success) {
    allowances[msg.sender][_spender] = _value;
    emit Approval(msg.sender, _spender, _value);
    return true;
  }

  function approveAndCall(address _spender, uint _value, bytes _data) public returns (bool success) {
    approve(_spender, _value);
    emit Approval(msg.sender, _spender, _value);
    ApproveAndCallFallBack(_spender).receiveApproval(msg.sender, _value, this, _data);
    return true;
  }

  function transferFrom(address _from, address _to, uint _value) public returns (bool success) {
    balances[_from] = balances[_from].sub(_value);
    allowances[_from][msg.sender] = allowances[_from][msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    emit Transfer(_from, _to, _value);
    return true;
  }

  function allowance(address _owner, address _spender) public constant returns (uint remaining) {
    return allowances[_owner][_spender];
  }

  function burnTokens(uint _amount) public onlyOwner {
    _totalSupply = _totalSupply.sub(_amount);
    balances[msg.sender] = balances[msg.sender].sub(_amount);
    emit Burn(msg.sender, _amount);
    emit Transfer(msg.sender, 0x0, _amount);
  }
}
function transfer(address _to, uint _value) public returns (bool success) {
    require(_to != 0x0);

    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    emit Transfer(msg.sender, _to, _value);
    return true;
  }
// Transfer tokens from owner address