function voteWithProfile(uint256[] candidateIndexes, address ERC725Address) public {
		require(votingClosingTime != 0, "Voting has not yet started!");
		require(votingClosingTime >= block.timestamp, "Voting period has expired!");
		
		require(walletApproved[msg.sender] == true || walletApproved[ERC725Address] == true, "Sender is not approved and thus cannot vote!");

		require(walletVoted[msg.sender] == false, "Sender already voted!");
		require(walletVoted[ERC725Address] == false, "Profile was already used for voting!");

		require(candidateIndexes.length == 3, "Must vote for 3 candidates!");

		require(candidateIndexes[0] != candidateIndexes[1], "Cannot cast multiple votes for the same person!");
		require(candidateIndexes[1] != candidateIndexes[2], "Cannot cast multiple votes for the same person!");
		require(candidateIndexes[2] != candidateIndexes[0], "Cannot cast multiple votes for the same person!");

		require(candidateIndexes[0] >= 0 && candidateIndexes[0] < candidates.length, "The selected candidate does not exist!");
		require(candidateIndexes[1] >= 0 && candidateIndexes[1] < candidates.length, "The selected candidate does not exist!");
		require(candidateIndexes[2] >= 0 && candidateIndexes[2] < candidates.length, "The selected candidate does not exist!");

		walletVoted[msg.sender] = true;
		walletVoted[ERC725Address] = true;
		emit WalletVoted(msg.sender, candidates[candidateIndexes[0]].name, candidates[candidateIndexes[1]].name, candidates[candidateIndexes[2]].name);
		
		assert(candidates[candidateIndexes[0]].votes + 3 > candidates[candidateIndexes[0]].votes);
		candidates[candidateIndexes[0]].votes = candidates[candidateIndexes[0]].votes + 3;		

		assert(candidates[candidateIndexes[1]].votes + 2 > candidates[candidateIndexes[1]].votes);
		candidates[candidateIndexes[1]].votes = candidates[candidateIndexes[1]].votes + 2;		
	
		assert(candidates[candidateIndexes[2]].votes + 1 > candidates[candidateIndexes[2]].votes);
		candidates[candidateIndexes[2]].votes = candidates[candidateIndexes[2]].votes + 1;		

		require(ERC725(ERC725Address).keyHasPurpose(keccak256(abi.encodePacked(msg.sender)), 2), 
			"Sender is not the management wallet for this ERC725 identity!");
			
		require(tokenContract.balanceOf(msg.sender) >= 10^21 || profileStorageContract.getStake(ERC725Address) >= 10^21,
		    "Neither the sender nor the submitted profile have at least 1000 TRAC and thus cannot vote!");
	}