diff --git a/tools/dhtnet_crtmgr/README.md b/tools/dhtnet_crtmgr/README.md
new file mode 100644
index 0000000..d1c1acb
--- /dev/null
+++ b/tools/dhtnet_crtmgr/README.md
@@ -0,0 +1,46 @@
+# DHTNet Certificate Manager
+
+
+## Description
+
+The DHTNet Certificate Manager is a command-line tool designed to manage certificates and keys for the DHTNet network. It provides functionality for generating and signing certificates.
+
+## Features
+
+- Generate new certificates
+- Sign certificates
+- Display the user identifier
+
+
+## Option
+- `-h, --help`: Display this help message and then exit.
+- `-v, --version`: Show the version of the program.
+- `-p, --privatekey`: Provide the path to the private key as an argument.
+- `-c, --certificate`: Provide the path to the certificate  as an argument.
+- `-o, --output`: Provide the path where the generated certificate should be saved as an argument.
+- `-g, --identifier`: Display the user identifier.
+- `-n, --name`: Provide the name of the certificate to be generated.
+- `-s, --setup`: Create an CA and an certificate.
+
+## Usage
+
+To create a new certficate:
+```bash
+dhtnet-crtmgr -o <output> -n <name>
+```
+Specify the path to save the generated certificate. The name is optional.
+
+To create a certificate signed by another certificate:
+```bash
+dhtnet-crtmgr -o <output> -c <signer_certificate_path> -p <signer_private_key_path>
+```
+
+To display the identifier:
+```bash
+dhtnet-crtmgr -o <output> -c <certificate_path> -p <private_key_path>
+```
+
+To generate a CA and an certificate:
+```bash
+dhtnet-crtmgr -o <output> -s
+```
\ No newline at end of file
diff --git a/tools/dhtnet_crtmgr/main.cpp b/tools/dhtnet_crtmgr/main.cpp
index f27d5bb..95687cc 100644
--- a/tools/dhtnet_crtmgr/main.cpp
+++ b/tools/dhtnet_crtmgr/main.cpp
@@ -42,7 +42,7 @@
     = {{"help", no_argument, nullptr, 'h'},
        {"version", no_argument, nullptr, 'v'},
        {"CA", required_argument, nullptr, 'c'},
-       {"id", required_argument, nullptr, 'i'},
+       {"id", required_argument, nullptr, 'o'},
        {"privatekey", required_argument, nullptr, 'p'},
        {"name", required_argument, nullptr, 'n'},
        {"pkid", no_argument, nullptr, 'g'},
@@ -54,7 +54,7 @@
 {
     dhtnet_crtmgr_params params;
     int opt;
-    while ((opt = getopt_long(argc, argv, "hgsv:c:i:p:n:", long_options, nullptr)) != -1) {
+    while ((opt = getopt_long(argc, argv, "hgsv:c:o:p:n:", long_options, nullptr)) != -1) {
         switch (opt) {
         case 'h':
             params.help = true;
@@ -65,7 +65,7 @@
         case 'c':
             params.ca = optarg;
             break;
-        case 'i':
+        case 'o':
             params.id = optarg;
             break;
         case 'p':
@@ -87,7 +87,8 @@
     }
 
     if (params.id.empty() && !params.pkid) {
-        std::cerr << "Error: The path to save the generated identity is not provided.\n Please specify the path for saving the generated identity using the -i option.\n";        exit(EXIT_FAILURE);
+        std::cerr << "Error: The path to save the generated certificate is not provided.\n Please specify the path using the -i option.\n";
+        exit(EXIT_FAILURE);
     }
     return params;
 }
@@ -104,11 +105,11 @@
                 "  -h, --help            Display this help message and then exit.\n"
                 "  -v, --version         Show the version of the program.\n"
                 "  -p, --privatekey      Provide the path to the private key as an argument.\n"
-                "  -c, --CA              Provide the path to the Certificate Authority as an argument.\n"
-                "  -i, --id              Provide the path where the generated identity should be saved as an argument.\n"
-                "  -g, --pkid            Display the publickey id used by the server dnc.\n"
-                "  -n, --name            Provide the name of the identity to be generated.\n"
-                "  -s, --setup           Create an CA and an id.\n");
+                "  -c, --certificate     Provide the path to the certificate  as an argument.\n"
+                "  -o, --output          Provide the path where the generated certificate should be saved as an argument.\n"
+                "  -g, --identifier      Display the user identifier.\n"
+                "  -n, --name            Provide the name of the certificate to be generated.\n"
+                "  -s, --setup           Create an CA and a certificate.\n");
         return EXIT_SUCCESS;
     }
 
@@ -119,7 +120,7 @@
     // check if the public key id is requested
     if (params.pkid) {
         if (params.ca.empty() || params.privatekey.empty()) {
-            fmt::print(stderr, "Error: The path to the private key and the Certificate Authority is not provided.\n Please specify the path for the private key and the Certificate Authority using the -p and -c options.\n");
+            fmt::print(stderr, "Error: The path to the private key and the certificate  is not provided.\n Please specify the path for the private key and the certificate  using the -p and -c options.\n");
             exit(EXIT_FAILURE);
         }
         auto identity = dhtnet::loadIdentity(params.privatekey, params.ca);
@@ -136,26 +137,26 @@
         // create identity with name id-server
         std::filesystem::path path_id = params.id / "id";
         auto identity = dhtnet::generateIdentity(path_id, "id-server", ca);
-        fmt::print("Generated identity in {}: {} {}\n", path_id,"id-server", identity.second->getId());
+        fmt::print("Generated certificate in {}: {} {}\n", path_id,"id-server", identity.second->getId());
         return EXIT_SUCCESS;
     }
 
     if (params.ca.empty() || params.privatekey.empty()) {
         if (params.name.empty()) {
             auto ca = dhtnet::generateIdentity(params.id, "ca");
-            fmt::print("Generated CA in {}: {} {}\n", params.id, "ca", ca.second->getId());
+            fmt::print("Generated certificate in {}: {} {}\n", params.id, "ca", ca.second->getId());
         }else{
         auto ca = dhtnet::generateIdentity(params.id, params.name);
-        fmt::print("Generated CA in {}: {} {}\n", params.id, params.name, ca.second->getId());
+        fmt::print("Generated certificate in {}: {} {}\n", params.id, params.name, ca.second->getId());
         }
     }else{
         auto ca = dhtnet::loadIdentity(params.privatekey, params.ca);
         if (params.name.empty()) {
-            auto id = dhtnet::generateIdentity(params.id, "id", ca);
-            fmt::print("Generated identity in {}: {} {}\n", params.id, "id", id.second->getId());
+            auto id = dhtnet::generateIdentity(params.id, "certificate", ca);
+            fmt::print("Generated certificate in {}: {} {}\n", params.id, "certificate", id.second->getId());
         }else{
             auto id = dhtnet::generateIdentity(params.id, params.name, ca);
-            fmt::print("Generated identity in {}: {} {}\n", params.id, params.name, id.second->getId());
+            fmt::print("Generated certificate in {}: {} {}\n", params.id, params.name, id.second->getId());
         }
     }
     return EXIT_SUCCESS;
