diff --git a/contracts/mainnet/connectors/morpho-aave-v3/events.sol b/contracts/mainnet/connectors/morpho-aave-v3/events.sol
index 189d6889..295bc51c 100644
--- a/contracts/mainnet/connectors/morpho-aave-v3/events.sol
+++ b/contracts/mainnet/connectors/morpho-aave-v3/events.sol
@@ -35,19 +35,6 @@ contract Events {
 		uint256 setId
 	);
 
-	event LogDepositWithPermit(
-		address tokenAddress,
-		uint256 amount,
-		address onBehalf,
-		uint256 maxIteration,
-		uint256 time,
-		uint8 v,
-		bytes32 r,
-		bytes32 s,
-		uint256 getId,
-		uint256 setId
-	);
-
 	event LogDepositCollateral(
 		address tokenAddress,
 		uint256 amount,
@@ -63,22 +50,18 @@ contract Events {
 		uint256 setId
 	);
 
-	event LogDepositCollateralWithPermit(
+	event LogBorrow(
 		address tokenAddress,
 		uint256 amount,
-		address onBehalf,
-		uint256 maxIteration,
-		uint256 time,
-		uint8 v,
-		bytes32 r,
-		bytes32 s,
+		address receiver,
 		uint256 getId,
 		uint256 setId
 	);
 
-	event LogBorrow(
+	event LogBorrowOnBehalf(
 		address tokenAddress,
 		uint256 amount,
+		address onBehalf,
 		address receiver,
 		uint256 getId,
 		uint256 setId
@@ -96,8 +79,8 @@ contract Events {
 	event LogBorrowOnBehalfWithMaxIterations(
 		address tokenAddress,
 		uint256 amount,
-		address receiver,
 		address onBehalf,
+		address receiver,
 		uint256 maxIteration,
 		uint256 getId,
 		uint256 setId
@@ -105,15 +88,49 @@ contract Events {
 
 	event LogWithdraw(
 		address tokenAddress,
-		address poolTokenAddress,
 		uint256 amount,
+		address receiver,
+		uint256 getId,
+		uint256 setId
+	);
+
+	event LogWithdrawOnBehalf(
+		address tokenAddress,
+		uint256 amount,
+		address onBehalf,
+		address receiver,
+		uint256 getId,
+		uint256 setId
+	);
+
+	event LogWithdrawWithMaxIterations(
+		address tokenAddress,
+		uint256 amount,
+		address receiver,
+		uint256 maxIteration,
+		uint256 getId,
+		uint256 setId
+	);
+
+	event LogWithdrawCollateral(
+		address tokenAddress,
+		uint256 amount,
+		address receiver,
+		uint256 getId,
+		uint256 setId
+	);
+
+	event LogWithdrawCollateralOnBehalf(
+		address tokenAddress,
+		uint256 amount,
+		address onBehalf,
+		address receiver,
 		uint256 getId,
 		uint256 setId
 	);
 
 	event LogPayback(
 		address tokenAddress,
-		address poolTokenAddress,
 		uint256 amount,
 		uint256 getId,
 		uint256 setId
@@ -121,9 +138,8 @@ contract Events {
 
 	event LogPaybackOnBehalf(
 		address tokenAddress,
-		address poolTokenAddress,
-		address onBehalf,
 		uint256 amount,
+		address onBehalf,
 		uint256 getId,
 		uint256 setId
 	);
diff --git a/contracts/mainnet/connectors/morpho-aave-v3/helpers.sol b/contracts/mainnet/connectors/morpho-aave-v3/helpers.sol
index 038c4ea6..d8041c01 100644
--- a/contracts/mainnet/connectors/morpho-aave-v3/helpers.sol
+++ b/contracts/mainnet/connectors/morpho-aave-v3/helpers.sol
@@ -5,12 +5,13 @@ import "./interface.sol";
 import "../../common/stores.sol";
 import "../../common/basic.sol";
 import "../../common/interfaces.sol";
+import "@openzeppelin/contracts/access/Ownable.sol";
 
-abstract contract Helpers is Stores, Basic {
+abstract contract Helpers is Stores, Basic, Ownable {
 	IMorphoCore public constant MORPHO_AAVE_V3 =
 		IMorphoCore(0x777777c9898D384F785Ee44Acfe945efDFf5f3E0);
 	
-	uint256 public constant MAX_ITERATION = 10;
+	uint256 public max_iteration = 10;
 
 	IMorphoAaveLens public constant MORPHO_AAVE_LENS =
 		IMorphoAaveLens(0x507fA343d0A90786d86C7cd885f5C49263A91FF4);
@@ -31,4 +32,8 @@ abstract contract Helpers is Stores, Basic {
 		        if (_amt == uint256(-1)) _amt = _tokenContract.balanceOf(address(this)); 
 		}
 	}
+
+	function setMaxIteration(uint256 _iter) external onlyOwner {
+		max_iteration = _iter;
+	}
 }
diff --git a/contracts/mainnet/connectors/morpho-aave-v3/interface.sol b/contracts/mainnet/connectors/morpho-aave-v3/interface.sol
index 4e35d487..27e34422 100644
--- a/contracts/mainnet/connectors/morpho-aave-v3/interface.sol
+++ b/contracts/mainnet/connectors/morpho-aave-v3/interface.sol
@@ -3,34 +3,6 @@ pragma solidity ^0.7.0;
 pragma experimental ABIEncoderV2;
 
 interface IMorphoCore {
-	// function supply(
-	// 	address _poolTokenAddress,
-	// 	address _onBehalf,
-	// 	uint256 _amount
-	// ) external;
-
-	// function supply(
-	// 	address _poolToken,
-	// 	address _onBehalf,
-	// 	uint256 _amount,
-	// 	uint256 _maxGasForMatching
-	// ) external;
-
-	// function borrow(address _poolTokenAddress, uint256 _amount) external;
-
-	// function borrow(
-	// 	address _poolToken,
-	// 	uint256 _amount,
-	// 	uint256 _maxGasForMatching
-	// ) external;
-
-	// function withdraw(address _poolTokenAddress, uint256 _amount) external;
-
-	// function repay(
-	// 	address _poolTokenAddress,
-	// 	address _onBehalf,
-	// 	uint256 _amount
-	// ) external;
     struct Signature {
         uint8 v;
         bytes32 r;
@@ -84,23 +56,3 @@ interface IMorphoCore {
         external
         returns (uint256 withdrawn);
 }
-
-interface IMorphoAaveLens {
-	function getCurrentBorrowBalanceInOf(address _poolToken, address _user)
-		external
-		view
-		returns (
-			uint256 balanceInP2P,
-			uint256 balanceOnPool,
-			uint256 totalBalance
-		);
-
-	function getCurrentSupplyBalanceInOf(address _poolToken, address _user)
-		external
-		view
-		returns (
-			uint256 balanceInP2P,
-			uint256 balanceOnPool,
-			uint256 totalBalance
-		);
-}
diff --git a/contracts/mainnet/connectors/morpho-aave-v3/main.sol b/contracts/mainnet/connectors/morpho-aave-v3/main.sol
index 08acbc03..c7ad517a 100644
--- a/contracts/mainnet/connectors/morpho-aave-v3/main.sol
+++ b/contracts/mainnet/connectors/morpho-aave-v3/main.sol
@@ -30,7 +30,7 @@ abstract contract MorphoAaveV3 is Helpers, Events {
 
 		approve(_tokenContract, address(MORPHO_AAVE_V3), _amt);
 
-		MORPHO_AAVE_V3.supply(_tokenContract, _amt, address(this), MAX_ITERATION);
+		MORPHO_AAVE_V3.supply(_tokenContract, _amt, address(this), max_iteration);
 
 		setUint(_setId, _amt);
 
@@ -48,14 +48,14 @@ abstract contract MorphoAaveV3 is Helpers, Events {
 	 * @notice Deposit a token to Morpho Aave for lending / collaterization.
 	 * @param _tokenAddress The address of underlying token to deposit.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param _amount The amount of the token (in underlying) to deposit. (For max: `uint256(-1)`)
-	 * @param _onBehalf The address of user on behalf to deposit.
+	 * @param _maxIteration The maximum number of iterations allowed during the matching process.
 	 * @param _getId ID to retrieve amt.
 	 * @param _setId ID stores the amount of tokens deposited.
 	 */
 	function depositWithMaxIterations(
 		address _tokenAddress,
 		uint256 _amount,
-		address _onBehalf,
+		address _maxIteration,
 		uint256 _getId,
 		uint256 _setId
 	)
@@ -70,15 +70,15 @@ abstract contract MorphoAaveV3 is Helpers, Events {
 
 		approve(_tokenContract, address(MORPHO_AAVE_V3), _amt);
 
-		MORPHO_AAVE_V3.supply(_tokenContract, _amt, _onBehalf, MAX_ITERATION);
+		MORPHO_AAVE_V3.supply(_tokenContract, _amt, address(this), _maxIteration);
 
 		setUint(_setId, _amt);
 
-		_eventName = "LogDepositWithMaxIterations(address,uint256,address,uint256,uint256)";
+		_eventName = "LogDepositWithMaxIterations(address,uint256,uint256,uint256,uint256)";
 		_eventParam = abi.encode(
 			_tokenAddress,
 			_amt,
-			_onBehalf,
+			_maxIteration,
 			_getId,
 			_setId
 		);
@@ -111,7 +111,7 @@ abstract contract MorphoAaveV3 is Helpers, Events {
 
 		approve(_tokenContract, address(MORPHO_AAVE_V3), _amt);
 
-		MORPHO_AAVE_V3.supply(_tokenContract, _amt, _onBehalf, MAX_ITERATION);
+		MORPHO_AAVE_V3.supply(_tokenContract, _amt, _onBehalf, max_iteration);
 
 		setUint(_setId, _amt);
 
@@ -131,7 +131,7 @@ abstract contract MorphoAaveV3 is Helpers, Events {
 	 * @param _tokenAddress The address of underlying token to deposit.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param _amount The amount of the token (in underlying) to deposit. (For max: `uint256(-1)`)
 	 * @param _onBehalf The address of user on behalf to deposit.
-	 * @param _onBehalf The address of user on behalf to deposit.
+	 * @param _maxIteration The maximum number of iterations allowed during the matching process.
 	 * @param _getId ID to retrieve amt.
 	 * @param _setId ID stores the amount of tokens deposited.
 	 */
@@ -169,55 +169,6 @@ abstract contract MorphoAaveV3 is Helpers, Events {
 		);
 	}
 
-	// /**
-	//  * @notice Supplies `amount` of `underlying` of `onBehalf` using permit2 in a single tx.
-	//  * @param _tokenAddress The address of underlying token to deposit.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
-	//  * @param _amount The amount of the token (in underlying) to deposit. (For max: `uint256(-1)`)
-	//  * @param _onBehalf The address of user on behalf to deposit.
-	//  * @param _maxIterations The maximum number of iterations allowed during the matching process.
-	//  * @param _signature The permit2 signature.
-	//  * @param _getId ID to retrieve amt.
-	//  * @param _setId ID stores the amount of tokens deposited.
-	//  */
-	// function depositWithPermit(
-	// 	address _tokenAddress,
-	// 	uint256 _amount,
-	// 	address _onBehalf,
-	// 	uint256 _maxIterations,
-	// 	Signature calldata _signature,
-	// 	uint256 _getId,
-	// 	uint256 _setId
-	// )
-	// 	external
-	// 	payable
-	// 	returns (string memory _eventName, bytes memory _eventParam)
-	// {
-	// 	(
-	// 		TokenInterface _tokenContract,
-	// 		uint256 _amt
-	// 	) = _performEthToWethConversion(_tokenAddress, _amount, _getId);
-
-	// 	approve(_tokenContract, address(MORPHO_AAVE_V3), _amt);
-
-	// 	MORPHO_AAVE_V3.supplyWithPermit(_tokenContract, _amt, _onBehalf, _maxIterations, block.timestamp, _signature);
-
-	// 	setUint(_setId, _amt);
-
-	// 	_eventName = "LogDepositWithPermit(address,uint256,address,uint256,uint256,uint8,bytes32,bytes32,uint256,uint256)";
-	// 	_eventParam = abi.encode(
-	// 		_tokenAddress,
-	// 		_amt,
-	// 		_onBehalf,
-	// 		_maxIterations,
-	// 		block.timestamp,
-	// 		_signature.v,
-	// 		_signature.r,
-	// 		_signature.s,
-	// 		_getId,
-	// 		_setId
-	// 	);
-	// }
-
 	/**
 	 * @dev Deposit ETH/ERC20_Token on behalf of a user.
 	 * @notice Deposit a token to Morpho Aave for lending / collaterization on behalf of a user.
@@ -297,52 +248,6 @@ abstract contract MorphoAaveV3 is Helpers, Events {
 		);
 	}
 
-	// /**
-	//  * @notice Supplies `amount` of `underlying` of `onBehalf` using permit2 in a single tx.
-	//  * @param _tokenAddress The address of underlying token to deposit.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
-	//  * @param _amount The amount of the token (in underlying) to deposit. (For max: `uint256(-1)`)
-	//  * @param _onBehalf The address of user on behalf to deposit.
-	//  * @param _signature The permit2 signature.
-	//  * @param _getId ID to retrieve amt.
-	//  * @param _setId ID stores the amount of tokens deposited.
-	//  */
-	// function depositCollateralWithPermit(
-	// 	address _tokenAddress,
-	// 	uint256 _amount,
-	// 	address _onBehalf,
-	// 	Signature calldata _signature,
-	// 	uint256 _getId,
-	// 	uint256 _setId
-	// )
-	// 	external
-	// 	payable
-	// 	returns (string memory _eventName, bytes memory _eventParam)
-	// {
-	// 	(
-	// 		TokenInterface _tokenContract,
-	// 		uint256 _amt
-	// 	) = _performEthToWethConversion(_tokenAddress, _amount, _getId);
-
-	// 	approve(_tokenContract, address(MORPHO_AAVE_V3), _amt);
-
-	// 	MORPHO_AAVE_V3.supplyCollateralWithPermit(_tokenContract, _amt, _onBehalf, block.timestamp, _signature);
-
-	// 	setUint(_setId, _amt);
-
-	// 	_eventName = "LogDepositCollateralWithPermit(address,uint256,address,uint256,uint8,bytes32,bytes32,uint256,uint256)";
-	// 	_eventParam = abi.encode(
-	// 		_tokenAddress,
-	// 		_amt,
-	// 		_onBehalf,
-	// 		block.timestamp,
-	// 		_signature.v,
-	// 		_signature.r,
-	// 		_signature.s,
-	// 		_getId,
-	// 		_setId
-	// 	);
-	// }
-
 	/**
 	 * @dev Borrow ETH/ERC20_Token.
 	 * @notice Borrow a token from Morpho Aave.
@@ -364,7 +269,7 @@ abstract contract MorphoAaveV3 is Helpers, Events {
 	{
 		uint256 _amt = getUint(_getId, _amount);
 
-		MORPHO_AAVE_V3.borrow(_tokenAddress, _amt, address(this), _receiver, MAX_ITERATION);
+		MORPHO_AAVE_V3.borrow(_tokenAddress, _amt, address(this), _receiver, max_iteration);
 
 		convertWethToEth(_tokenAddress == ethAddr, TokenInterface(wethAddr), _amt);
 
@@ -391,8 +296,8 @@ abstract contract MorphoAaveV3 is Helpers, Events {
 	function borrowOnBehalf(
 		address _tokenAddress,
 		uint256 _amount,
-		address _receiver,
 		address _onBehalf,
+		address _receiver,
 		uint256 _getId,
 		uint256 _setId
 	)
@@ -402,16 +307,17 @@ abstract contract MorphoAaveV3 is Helpers, Events {
 	{
 		uint256 _amt = getUint(_getId, _amount);
 
-		MORPHO_AAVE_V3.borrow(_tokenAddress, _amt, address(this), _receiver, MAX_ITERATION);
+		MORPHO_AAVE_V3.borrow(_tokenAddress, _amt, _onBehalf, _receiver, max_iteration);
 
 		convertWethToEth(_tokenAddress == ethAddr, _onBehalf, _amt);
 
 		setUint(_setId, _amt);
 
-		_eventName = "LogBorrowOnBehalf(address,uint256,addresss,uint256,uint256)";
+		_eventName = "LogBorrowOnBehalf(address,uint256,addresss,address,uint256,uint256)";
 		_eventParam = abi.encode(
 			_tokenAddress,
 			_amt,
+			_onBehalf,
 			_receiver,
 			_getId,
 			_setId
@@ -490,6 +396,7 @@ abstract contract MorphoAaveV3 is Helpers, Events {
 		_eventParam = abi.encode(
 			_tokenAddress,
 			_amt,
+			_onBehalf,
 			_receiver,
 			_maxIteration,
 			_getId,
@@ -497,60 +404,18 @@ abstract contract MorphoAaveV3 is Helpers, Events {
 		);
 	}
 
-	// /**
-	//  * @dev Borrow ETH/ERC20_Token with max gas.
-	//  * @notice Borrow a token from Morpho Aave with max gas.
-	//  * @param _tokenAddress The address of underlying token to borrow.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE).
-	//  * @param _poolTokenAddress The address of aToken to borrow.(For ETH: aWETH address).
-	//  * @param _amount The amount of the token (in underlying) to borrow.
-	//  * @param _maxGasForMatching The maximum amount of gas to consume within a matching engine loop.
-	//  * @param _getId ID to retrieve amt.
-	//  * @param _setId ID stores the amount of tokens borrowed.
-	//  */
-	// function borrowWithMaxGas(
-	// 	address _tokenAddress,
-	// 	address _poolTokenAddress,
-	// 	uint256 _amount,
-	// 	uint256 _maxGasForMatching,
-	// 	uint256 _getId,
-	// 	uint256 _setId
-	// )
-	// 	external
-	// 	payable
-	// 	returns (string memory _eventName, bytes memory _eventParam)
-	// {
-	// 	uint256 _amt = getUint(_getId, _amount);
-
-	// 	MORPHO_AAVE_V3.borrow(_poolTokenAddress, _amt, _maxGasForMatching);
-
-	// 	convertWethToEth(_tokenAddress == ethAddr, TokenInterface(wethAddr), _amt);
-
-	// 	setUint(_setId, _amt);
-
-	// 	_eventName = "LogBorrowWithMaxGas(address,address,uint256,uint256,uint256,uint256)";
-	// 	_eventParam = abi.encode(
-	// 		_tokenAddress,
-	// 		_poolTokenAddress,
-	// 		_amt,
-	// 		_maxGasForMatching,
-	// 		_getId,
-	// 		_setId
-	// 	);
-	// }
-
 	/**
 	 * @dev Withdraw ETH/ERC20_Token.
 	 * @notice Withdraw a token from Morpho Aave.
 	 * @param _tokenAddress The address of underlying token to withdraw.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
-	 * @param _poolTokenAddress The address of aToken to withdraw.(For ETH: aWETH address)
 	 * @param _amount The amount of the token (in underlying) to withdraw. (For max: `uint256(-1)`)
 	 * @param _getId ID to retrieve amt.
 	 * @param _setId ID stores the amount of tokens withdrawed.
 	 */
 	function withdraw(
 		address _tokenAddress,
-		address _poolTokenAddress,
 		uint256 _amount,
+		address _receiver,
 		uint256 _getId,
 		uint256 _setId
 	)
@@ -559,23 +424,153 @@ abstract contract MorphoAaveV3 is Helpers, Events {
 		returns (string memory _eventName, bytes memory _eventParam)
 	{
 		uint256 _amt = getUint(_getId, _amount);
-		if (_amt == uint256(-1))
-			(, , _amt) = MORPHO_AAVE_LENS.getCurrentSupplyBalanceInOf(
-				_poolTokenAddress,
-				address(this)
-			);
-
-		MORPHO_AAVE_V3.withdraw(_poolTokenAddress, _amt);
+		MORPHO_AAVE_V3.withdraw(_tokenAddress, _amt, address(this), _receiver, max_iteration);
 
 		convertWethToEth(_tokenAddress == ethAddr, TokenInterface(wethAddr), _amt);
 
 		setUint(_setId, _amt);
 
-		_eventName = "LogWithdraw(address,address,uint256,uint256,uint256)";
+		_eventName = "LogWithdraw(address,uint256,address,uint256,uint256)";
 		_eventParam = abi.encode(
 			_tokenAddress,
-			_poolTokenAddress,
 			_amt,
+			_receiver,
+			_getId,
+			_setId
+		);
+	}
+
+	/**
+	 * @dev Withdraw ETH/ERC20_Token.
+	 * @notice Withdraw a token from Morpho Aave.
+	 * @param _tokenAddress The address of underlying token to withdraw.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param _amount The amount of the token (in underlying) to withdraw. (For max: `uint256(-1)`)
+	 * @param _getId ID to retrieve amt.
+	 * @param _setId ID stores the amount of tokens withdrawed.
+	 */
+	function withdrawOnBehalf(
+		address _tokenAddress,
+		uint256 _amount,
+		address _onBehalf,
+		address _receiver,
+		uint256 _getId,
+		uint256 _setId
+	)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		uint256 _amt = getUint(_getId, _amount);
+		MORPHO_AAVE_V3.withdraw(_tokenAddress, _amt, _onBehalf, _receiver, max_iteration);
+
+		convertWethToEth(_tokenAddress == ethAddr, TokenInterface(wethAddr), _amt);
+
+		setUint(_setId, _amt);
+
+		_eventName = "LogWithdrawOnBehalf(address,uint256,address,address,uint256,uint256)";
+		_eventParam = abi.encode(
+			_tokenAddress,
+			_amt,
+			_onBehalf,
+			_receiver,
+			_getId,
+			_setId
+		);
+	}
+
+	/**
+	 * @dev Withdraw ETH/ERC20_Token.
+	 * @notice Withdraw a token from Morpho Aave.
+	 * @param _tokenAddress The address of underlying token to withdraw.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param _amount The amount of the token (in underlying) to withdraw. (For max: `uint256(-1)`)
+	 * @param _getId ID to retrieve amt.
+	 * @param _setId ID stores the amount of tokens withdrawed.
+	 */
+	function withdrawWithMaxIterations(
+		address _tokenAddress,
+		uint256 _amount,
+		address _onBehalf,
+		address _receiver,
+		uint256 _maxIteration,
+		uint256 _getId,
+		uint256 _setId
+	)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		uint256 _amt = getUint(_getId, _amount);
+
+		MORPHO_AAVE_V3.withdraw(_tokenAddress, _amt, _onBehalf, _receiver, _maxIteration);
+
+		convertWethToEth(_tokenAddress == ethAddr, TokenInterface(wethAddr), _amt);
+
+		setUint(_setId, _amt);
+
+		_eventName = "LogWithdrawWithMaxIterations(address,uint256,address,uint256,uint256,uint256)";
+		_eventParam = abi.encode(
+			_tokenAddress,
+			_amt,
+			_receiver,
+			_maxIteration,
+			_getId,
+			_setId
+		);
+	}
+
+	function withdrawCollateral(
+		address _tokenAddress,
+		uint256 _amount,
+		address _receiver,
+		uint256 _getId,
+		uint256 _setId
+	)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		uint256 _amt = getUint(_getId, _amount);
+
+		MORPHO_AAVE_V3.withdrawCollateral(_tokenAddress, _amt, address(this), _receiver);
+
+		convertWethToEth(_tokenAddress == ethAddr, TokenInterface(wethAddr), _amt);
+
+		setUint(_setId, _amt);
+
+		_eventName = "LogWithdrawCollateral(address,uint256,address,uint256,uint256)";
+		_eventParam = abi.encode(
+			_tokenAddress,
+			_amt,
+			_receiver,
+			_getId,
+			_setId
+		);
+	}
+
+	function withdrawCollateralOnBehalf(
+		address _tokenAddress,
+		uint256 _amount,
+		address _onBehalf,
+		address _receiver,
+		uint256 _getId,
+		uint256 _setId
+	)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		uint256 _amt = getUint(_getId, _amount);
+		MORPHO_AAVE_V3.withdrawCollateral(_tokenAddress, _amt, _onBehalf, _receiver);
+		convertWethToEth(_tokenAddress == ethAddr, TokenInterface(wethAddr), _amt);
+
+		setUint(_setId, _amt);
+
+		_eventName = "LogWithdrawCollateralOnBehalf(address,uint256,address,address,uint256,uint256)";
+		_eventParam = abi.encode(
+			_tokenAddress,
+			_amt,
+			_onBehalf,
+			_receiver,
 			_getId,
 			_setId
 		);
@@ -585,14 +580,12 @@ abstract contract MorphoAaveV3 is Helpers, Events {
 	 * @dev Payback ETH/ERC20_Token.
 	 * @notice Payback a token to Morpho Aave.
 	 * @param _tokenAddress The address of underlying token to payback.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
-	 * @param _poolTokenAddress The address of aToken to payback.(For ETH: aWETH address)
 	 * @param _amount The amount of the token (in underlying) to payback. (For max: `uint256(-1)`)
 	 * @param _getId ID to retrieve amt.
 	 * @param _setId ID stores the amount of tokens paid back.
 	 */
 	function payback(
 		address _tokenAddress,
-		address _poolTokenAddress,
 		uint256 _amount,
 		uint256 _getId,
 		uint256 _setId
@@ -609,28 +602,22 @@ abstract contract MorphoAaveV3 is Helpers, Events {
 			: TokenInterface(_tokenAddress);
 
 		if (_amt == uint256(-1)) {
-			uint256 _amtDSA = _isETH
+			_amt = _isETH
 				? address(this).balance
 				: _tokenContract.balanceOf(address(this));
-
-			(, , uint256 _amtDebt) = MORPHO_AAVE_LENS
-				.getCurrentBorrowBalanceInOf(_poolTokenAddress, address(this));
-
-			_amt = _amtDSA < _amtDebt ? _amtDSA : _amtDebt;
 		}
 
 		convertEthToWeth(_isETH, _tokenContract, _amt);
 
 		approve(_tokenContract, address(MORPHO_AAVE_V3), _amt);
 
-		MORPHO_AAVE_V3.repay(_poolTokenAddress, address(this), _amt);
+		MORPHO_AAVE_V3.repay(_tokenAddress, _amt, address(this));
 
 		setUint(_setId, _amt);
 
-		_eventName = "LogPayback(address,address,uint256,uint256,uint256)";
+		_eventName = "LogPayback(address,uint256,uint256,uint256)";
 		_eventParam = abi.encode(
 			_tokenAddress,
-			_poolTokenAddress,
 			_amt,
 			_getId,
 			_setId
@@ -641,7 +628,6 @@ abstract contract MorphoAaveV3 is Helpers, Events {
 	 * @dev Payback ETH/ERC20_Token.
 	 * @notice Payback a token to Morpho Aave.
 	 * @param _tokenAddress The address of underlying token to payback.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
-	 * @param _poolTokenAddress The address of aToken to payback.(For ETH: aWETH address)
 	 * @param _onBehalf The address of user who's debt to repay.
 	 * @param _amount The amount of the token (in underlying) to payback. (For max: `uint256(-1)`)
 	 * @param _getId ID to retrieve amt.
@@ -649,7 +635,6 @@ abstract contract MorphoAaveV3 is Helpers, Events {
 	 */
 	function paybackOnBehalf(
 		address _tokenAddress,
-		address _poolTokenAddress,
 		address _onBehalf,
 		uint256 _amount,
 		uint256 _getId,
@@ -667,30 +652,24 @@ abstract contract MorphoAaveV3 is Helpers, Events {
 			: TokenInterface(_tokenAddress);
 
 		if (_amt == uint256(-1)) {
-			uint256 _amtDSA = _isETH
+			_amt = _isETH
 				? address(this).balance
 				: _tokenContract.balanceOf(address(this));
-
-			(, , uint256 _amtDebt) = MORPHO_AAVE_LENS
-				.getCurrentBorrowBalanceInOf(_poolTokenAddress, _onBehalf);
-
-			_amt = _amtDSA < _amtDebt ? _amtDSA : _amtDebt;
 		}
 
 		convertEthToWeth(_isETH, _tokenContract, _amt);
 
 		approve(_tokenContract, address(MORPHO_AAVE_V3), _amt);
 
-		MORPHO_AAVE_V3.repay(_poolTokenAddress, _onBehalf, _amt);
+		MORPHO_AAVE_V3.repay(_tokenAddress, _amt, _onBehalf);
 
 		setUint(_setId, _amt);
 
-		_eventName = "LogPaybackOnBehalf(address,address,address,uint256,uint256,uint256)";
+		_eventName = "LogPaybackOnBehalf(address,uint256,address,uint256,uint256)";
 		_eventParam = abi.encode(
 			_tokenAddress,
-			_poolTokenAddress,
-			_onBehalf,
 			_amt,
+			_onBehalf,
 			_getId,
 			_setId
 		);