Hi @hussammustafa,
I would suggest using the latest version of OpenZeppelin Contracts v3.x (currently v3.2) with Solidity 0.6.
Though the Solidity version will likely change in future releases to Solidity 0.7.
For the functionality you mentioned please see the following documentation:
- https://docs.openzeppelin.com/contracts/3.x/api/token/erc20#ERC20Pausable
- https://docs.openzeppelin.com/contracts/3.x/api/token/erc20#ERC20Burnable
- https://docs.openzeppelin.com/contracts/3.x/api/token/erc20#ERC20Capped
For minting see the Preset contract for an example of using AccessControl:
For simple vesting you could look at TokenTimelock:
If you want the contract to be upgradeable then you will need to use the upgrade safe fork which is OpenZeppelin Contracts Ethereum Package (The Future of contracts-ethereum-package). You can deploy upgradeable contracts using OpenZeppelin Upgrades Plugins for Truffle and Buidler: https://docs.openzeppelin.com/upgrades-plugins/1.x/