diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..fbef6e3
--- /dev/null
+++ b/.DS_Store
Binary files differ
diff --git a/README.md b/README.md
index 8781adb..8ff0675 100644
--- a/README.md
+++ b/README.md
@@ -31,7 +31,9 @@
     - [create Command](#create-command)
     - [compile Command](#compile-command)
     - [deploy Command](#deploy-command)
-    - [execute Command](#execute-command)
+    - [add_address Command](#add_address-command)
+    - [list-deployments Command](#list-deployments-command)
+    - [clear-registry Command](#clear-registry-command)
 - [Configuration ⚙️](#configuration-️)
   - [Setting the ResDB_Home Variable](#setting-the-resdb_home-variable)
     - [Option 1: Set `ResDB_Home` Environment Variable](#option-1-set-resdb_home-environment-variable)
@@ -43,8 +45,9 @@
 
 - **Create Smart Contracts**: Generate new smart contract templates.
 - **Compile Contracts**: Compile Solidity contracts to JSON.
-- **Deploy Smart Contracts**: Deploy contracts to the blockchain.
-- **Execute Functions**: Interact with and manage deployed contracts.
+- **Deploy Smart Contracts**: Deploy contracts to the blockchain with automatic registry tracking.
+- **Address Management**: Add external addresses to the system.
+- **Deployment Registry**: Track and manage deployed contracts with built-in registry commands.
 
 ## Prerequisites
 
@@ -179,31 +182,70 @@
 --arguments "1000000" --owner 0xYourAddress
 ```
 
-#### execute Command
+#### add_address Command
 
-Executes a smart contract function.
+Adds an external address to the system for contract interactions.
 
 **Usage:**
-
 ```bash
-rescontract execute --config <service.config> --sender <senderAddress> \
---contract <contractAddress> --function-name <functionName> --arguments "<parameters>"
+rescontract add_address --config <path> --external-address <address>
 ```
 
--   `--config, -c`: Path to the client configuration file.
--   `--sender, -m`: Address of the sender executing the function.
--   `--contract, -s`: Address of the deployed contract.
--   `--function-name, -f`: Name of the function to execute (include parameter types).
--   `--arguments, -a`: Arguments to pass to the function (enclosed in quotes).
+-   `--config, -c`: Path to the configuration file.
+-   `--external-address, -e`: External address to add to the system.
 
 **Example:**
 ```bash
-rescontract execute --config ~/resilientdb/config/service.config \
---sender 0xYourAddress --contract 0xContractAddress \
---function-name "transfer(address,uint256)" \
---arguments "0xRecipientAddress,100"
+rescontract add_address --config ~/resilientdb/config/service.config \
+--external-address 0xExternalAddress
 ```
 
+#### list-deployments Command
+
+Lists all deployed contracts tracked in the registry.
+
+**Usage:**
+```bash
+rescontract list-deployments
+```
+
+**Example:**
+```bash
+rescontract list-deployments
+```
+
+This command displays all deployed contracts with their owner addresses, contract names, and contract addresses.
+
+#### clear-registry Command
+
+Clears the deployed contracts registry.
+
+**Usage:**
+```bash
+rescontract clear-registry
+```
+
+**Example:**
+```bash
+rescontract clear-registry
+```
+
+**Warning:** This command permanently removes all deployment tracking information.
+
+## Deployment Registry 📋
+
+The ResContract CLI automatically tracks all deployed contracts in a registry file located at `~/.rescontract_deployed_contracts.json`. This registry provides several benefits:
+
+- **Duplicate Prevention**: Prevents deploying the same contract with the same owner and name
+- **Contract Tracking**: Maintains a record of all deployed contracts with their addresses
+- **Easy Management**: Use `list-deployments` to view all contracts and `clear-registry` to reset
+
+The registry stores the following information for each deployment:
+- Owner address
+- Contract name
+- Contract address
+- Deployment timestamp
+
 ## License
 
 This project is licensed under the MIT License - see the  [LICENSE](LICENSE)  file for details.
diff --git a/index.js b/index.js
index 57aa9f6..5279ca7 100755
--- a/index.js
+++ b/index.js
@@ -152,9 +152,9 @@
         'bazel-bin',
         'service',
         'tools',
-        'contract',
+        'kv',
         'api_tools',
-        'contract_tools'
+        'contract_service_tools'
       );
 
       if (!fs.existsSync(configPath)) {
@@ -163,7 +163,19 @@
         process.exit(1);
       }
 
-      await handleExecFile(commandPath, ['create', '-c', configPath]);
+      // Create JSON command file
+      const jsonConfig = { command: 'create_account' };
+      const jsonConfigPath = path.join(os.tmpdir(), `create_account_${Date.now()}.json`);
+      fs.writeFileSync(jsonConfigPath, JSON.stringify(jsonConfig, null, 2));
+
+      try {
+        await handleExecFile(commandPath, ['-c', configPath, '--config_file', jsonConfigPath]);
+      } finally {
+        // Clean up temporary file
+        if (fs.existsSync(jsonConfigPath)) {
+          fs.unlinkSync(jsonConfigPath);
+        }
+      }
     } catch (error) {
       logger.error(`Error executing create command: ${error.message}`);
       console.error(`Error: ${error.message}`);
@@ -260,27 +272,32 @@
         'bazel-bin',
         'service',
         'tools',
-        'contract',
+        'kv',
         'api_tools',
-        'contract_tools'
+        'contract_service_tools'
       );
 
-      const argList = [
-        'deploy',
-        '-c',
-        configPath,
-        '-p',
-        contract,
-        '-n',
-        name,
-        '-a',
-        args,
-        '-m',
-        owner,
-      ];
+      // Create JSON command file
+      const jsonConfig = {
+        command: 'deploy',
+        contract_path: contract,
+        contract_name: name,
+        init_params: args,
+        owner_address: owner
+      };
+      const jsonConfigPath = path.join(os.tmpdir(), `deploy_${Date.now()}.json`);
+      fs.writeFileSync(jsonConfigPath, JSON.stringify(jsonConfig, null, 2));
 
-      const output = await handleSpawnProcess(commandPath, argList);
-
+      let output;
+      try {
+        output = await handleSpawnProcess(commandPath, ['-c', configPath, '--config_file', jsonConfigPath]);
+      } finally {
+        // Clean up temporary file
+        if (fs.existsSync(jsonConfigPath)) {
+          fs.unlinkSync(jsonConfigPath);
+        }
+      }
+      
       const outputLines = output.split('\n');
       let ownerAddress = '';
       let contractAddress = '';
@@ -351,9 +368,9 @@
         'bazel-bin',
         'service',
         'tools',
-        'contract',
+        'kv',
         'api_tools',
-        'contract_tools'
+        'contract_service_tools'
       );
 
       if (!fs.existsSync(configPath)) {
@@ -362,13 +379,21 @@
         process.exit(1);
       }
 
-      await handleExecFile(commandPath, [
-        'add_address',
-        '-c',
-        configPath,
-        '-e',
-        externalAddress,
-      ]);
+      const jsonConfig = {
+        command: 'add_address',
+        address: externalAddress
+      };
+      const jsonConfigPath = path.join(os.tmpdir(), `add_address_${Date.now()}.json`);
+      fs.writeFileSync(jsonConfigPath, JSON.stringify(jsonConfig, null, 2));
+      
+      try {
+        await handleExecFile(commandPath, ['-c', configPath, '--config_file', jsonConfigPath]);
+      } finally {
+        // Clean up temporary file
+        if (fs.existsSync(jsonConfigPath)) {
+          fs.unlinkSync(jsonConfigPath);
+        }
+      }
     } catch (error) {
       logger.error(`Error executing add_address command: ${error.message}`);
       console.error(`Error: ${error.message}`);
