diff --git a/contracts/payloads/IGP33/PayloadIGP33.sol b/contracts/payloads/IGP33/PayloadIGP33.sol
new file mode 100644
index 0000000..8277dd2
--- /dev/null
+++ b/contracts/payloads/IGP33/PayloadIGP33.sol
@@ -0,0 +1,234 @@
+pragma solidity >=0.7.0;
+pragma experimental ABIEncoderV2;
+
+interface IGovernorBravo {
+    function _acceptAdmin() external;
+
+    function _setVotingDelay(uint newVotingDelay) external;
+
+    function _setVotingPeriod(uint newVotingPeriod) external;
+
+    function _acceptAdminOnTimelock() external;
+
+    function _setImplementation(address implementation_) external;
+
+    function propose(
+        address[] memory targets,
+        uint[] memory values,
+        string[] memory signatures,
+        bytes[] memory calldatas,
+        string memory description
+    ) external returns (uint);
+
+    function admin() external view returns (address);
+
+    function pendingAdmin() external view returns (address);
+
+    function timelock() external view returns (address);
+
+    function votingDelay() external view returns (uint256);
+
+    function votingPeriod() external view returns (uint256);
+}
+
+interface ITimelock {
+    function acceptAdmin() external;
+
+    function setDelay(uint delay_) external;
+
+    function setPendingAdmin(address pendingAdmin_) external;
+
+    function queueTransaction(
+        address target,
+        uint value,
+        string memory signature,
+        bytes memory data,
+        uint eta
+    ) external returns (bytes32);
+
+    function executeTransaction(
+        address target,
+        uint value,
+        string memory signature,
+        bytes memory data,
+        uint eta
+    ) external payable returns (bytes memory);
+
+    function pendingAdmin() external view returns (address);
+
+    function admin() external view returns (address);
+
+    function delay() external view returns (uint256);
+}
+
+interface AdminModuleStructs {
+    struct AddressBool {
+        address addr;
+        bool value;
+    }
+
+    struct AddressUint256 {
+        address addr;
+        uint256 value;
+    }
+
+    struct RateDataV1Params {
+        address token;
+        uint256 kink;
+        uint256 rateAtUtilizationZero;
+        uint256 rateAtUtilizationKink;
+        uint256 rateAtUtilizationMax;
+    }
+
+    struct RateDataV2Params {
+        address token;
+        uint256 kink1;
+        uint256 kink2;
+        uint256 rateAtUtilizationZero;
+        uint256 rateAtUtilizationKink1;
+        uint256 rateAtUtilizationKink2;
+        uint256 rateAtUtilizationMax;
+    }
+
+    struct TokenConfig {
+        address token;
+        uint256 fee;
+        uint256 threshold;
+        uint256 maxUtilization;
+    }
+
+    struct UserSupplyConfig {
+        address user;
+        address token;
+        uint8 mode;
+        uint256 expandPercent;
+        uint256 expandDuration;
+        uint256 baseWithdrawalLimit;
+    }
+
+    struct UserBorrowConfig {
+        address user;
+        address token;
+        uint8 mode;
+        uint256 expandPercent;
+        uint256 expandDuration;
+        uint256 baseDebtCeiling;
+        uint256 maxDebtCeiling;
+    }
+}
+
+interface IProxy {
+    function setAdmin(address newAdmin_) external;
+
+    function setDummyImplementation(address newDummyImplementation_) external;
+
+    function addImplementation(
+        address implementation_,
+        bytes4[] calldata sigs_
+    ) external;
+
+    function removeImplementation(address implementation_) external;
+
+    function getAdmin() external view returns (address);
+
+    function getDummyImplementation() external view returns (address);
+
+    function getImplementationSigs(
+        address impl_
+    ) external view returns (bytes4[] memory);
+
+    function getSigsImplementation(bytes4 sig_) external view returns (address);
+
+    function readFromStorage(
+        bytes32 slot_
+    ) external view returns (uint256 result_);
+}
+
+interface IInstaAccountV2Implementations {
+    function setDefaultImplementation(address _defaultImplementation) external;
+}
+
+contract PayloadIGP33 {
+    uint256 public constant PROPOSAL_ID = 33;
+
+    address public constant PROPOSER =
+        0xA45f7bD6A5Ff45D31aaCE6bCD3d426D9328cea01;
+
+    address public constant PROPOSER_AVO_MULTISIG =
+        0x059A94A72951c0ae1cc1CE3BF0dB52421bbE8210;
+
+    address public constant PROPOSER_AVO_MULTISIG_2 =
+        0x9efdE135CA4832AbF0408c44c6f5f370eB0f35e8;
+
+    address public constant PROPOSER_AVO_MULTISIG_3 = 
+        0x5C43AAC965ff230AC1cF63e924D0153291D78BaD;
+
+    IGovernorBravo public constant GOVERNOR =
+        IGovernorBravo(0x0204Cd037B2ec03605CFdFe482D8e257C765fA1B);
+    ITimelock public immutable TIMELOCK =
+        ITimelock(0x2386DC45AdDed673317eF068992F19421B481F4c);
+
+    address public immutable ADDRESS_THIS;
+
+    address public constant TEAM_MULTISIG =
+        0x4F6F977aCDD1177DCD81aB83074855EcB9C2D49e;
+
+    IInstaAccountV2Implementations public constant INSTA_ACCOUNT_V2_IMPLEMENTATIONS = IInstaAccountV2Implementations(0xCBA828153d3a85b30B5b912e1f2daCac5816aE9D);
+
+    constructor() {
+        ADDRESS_THIS = address(this);
+    }
+
+    function propose(string memory description) external {
+        require(
+            msg.sender == PROPOSER ||
+                msg.sender == TEAM_MULTISIG ||
+                address(this) == PROPOSER_AVO_MULTISIG ||
+                address(this) == PROPOSER_AVO_MULTISIG_2 ||
+                address(PROPOSER_AVO_MULTISIG_3) == PROPOSER_AVO_MULTISIG_3,
+            "msg.sender-not-allowed"
+        );
+
+        uint256 totalActions = 1;
+        address[] memory targets = new address[](totalActions);
+        uint256[] memory values = new uint256[](totalActions);
+        string[] memory signatures = new string[](totalActions);
+        bytes[] memory calldatas = new bytes[](totalActions);
+
+        // Action 1: call executePayload on timelock contract to execute payload related to DSA
+        targets[0] = address(TIMELOCK);
+        values[0] = 0;
+        signatures[0] = "executePayload(address,string,bytes)";
+        calldatas[0] = abi.encode(ADDRESS_THIS, "execute()", abi.encode());
+
+        uint256 proposedId = GOVERNOR.propose(
+            targets,
+            values,
+            signatures,
+            calldatas,
+            description
+        );
+
+        require(proposedId == PROPOSAL_ID, "PROPOSAL_IS_NOT_SAME");
+    }
+
+    function execute() external {
+        require(address(this) == address(TIMELOCK), "not-valid-caller");
+
+        // Action 1: Update Default Implementation of DSAv2
+        action1();
+    }
+
+    function verifyProposal() external view {}
+
+    /***********************************|
+    |     Proposal Payload Actions      |
+    |__________________________________*/
+
+    /// @notice Action 1: Update Default Implementation of DSAv2
+    function action1() internal {
+        address NEW_DEFAULT_IMPLEMENTATION = address(0);
+
+        INSTA_ACCOUNT_V2_IMPLEMENTATIONS.setDefaultImplementation(NEW_DEFAULT_IMPLEMENTATION);
+    }
+}