diff --git a/Cargo.lock b/Cargo.lock
index dc959cf6c68125eab1e3e61444f9e855a2a02c82..733c0a92ed110cb667ca6caebdbfc99ebcfcb951 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1031,6 +1031,7 @@ name = "durs-core"
 version = "0.3.0-dev"
 dependencies = [
  "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "dubp-currency-params 0.2.0",
diff --git a/lib/core/core/Cargo.toml b/lib/core/core/Cargo.toml
index b8bc60d018df9bac5cf9f39a5a8b1962adfdf1b1..66dfb3c54929f0d0860d3f468ffbb906dbab84dc 100644
--- a/lib/core/core/Cargo.toml
+++ b/lib/core/core/Cargo.toml
@@ -11,6 +11,7 @@ path = "src/lib.rs"
 
 [dependencies]
 chrono = "0.4"
+clap = "2.33.0"
 clear_on_drop = "0.2.3"
 dirs = "2.0.2"
 durs-bc = { path = "../../modules/blockchain/blockchain" }
@@ -31,6 +32,8 @@ serde = "1.0.*"
 serde_derive = "1.0.*"
 serde_json = "1.0.*"
 structopt= "0.3.4"
+#strum = "0.17.1"
+#strum_macros = "0.17.1"
 unwrap = "1.2.1"
 
 [features]
diff --git a/lib/core/core/src/commands/keys.rs b/lib/core/core/src/commands/keys.rs
index b67fef8e3cb472b4d5e241187f222ff9dac21715..882e37d9708931c4b6147827569b49fb0c0147cc 100644
--- a/lib/core/core/src/commands/keys.rs
+++ b/lib/core/core/src/commands/keys.rs
@@ -21,6 +21,8 @@ use crate::DursCore;
 use clear_on_drop::clear::Clear;
 use durs_conf::keys::*;
 use durs_conf::DuRsConf;
+//use strum_macros::EnumString;
+use clap::arg_enum;
 
 #[derive(StructOpt, Debug, Clone)]
 #[structopt(
@@ -90,21 +92,53 @@ pub enum ModifySubCommand {
     /// Salt and password of network key    
     NetworkSaltPassword(SaltPasswordOpt),
 }
+/*
+arg_enum! {
+    #[derive(StructOpt, Debug, Copy, Clone, PartialEq)]
+    /// Key to clear: member, network or all (both member and network)
+    enum ClearOpt {
+        MEMBER,
+        NETWORK,
+        ALL,
+    }
+}
+impl ClearOpt {
+    /// Returns if key kind is member
+    pub fn is_member(self) -> bool {
+        self == ClearOpt::MEMBER || self == ClearOpt::ALL
+    }
+    /// Returns if key kind is network
+    pub fn is_network(self) -> bool {
+        self == ClearOpt::NETWORK || self == ClearOpt::ALL
+    }
+}*/
+
+arg_enum! {
+    /// KeyKind
+    #[derive(Debug, Copy, Clone, PartialEq)]
+    enum KeyKind {
+        MEMBER,
+        NETWORK,
+        ALL,
+    }
+}
+impl KeyKind {
+    /// Returns if key kind is member
+    pub fn is_member(self) -> bool {
+        self == KeyKind::MEMBER || self == KeyKind::ALL
+    }
+    /// Returns if key kind is network
+    pub fn is_network(self) -> bool {
+        self == KeyKind::NETWORK || self == KeyKind::ALL
+    }
+}
 
 #[derive(StructOpt, Debug, Copy, Clone)]
 /// ClearOpt
 pub struct ClearOpt {
-    #[structopt(short = "m", long = "member")]
-    /// True if we change member key
-    pub member: bool,
-
-    #[structopt(short = "n", long = "network")]
-    /// True if we change network key
-    pub network: bool,
-
-    #[structopt(short = "a", long = "all")]
-    /// True if we change member and network key
-    pub all: bool,
+    /// Key to clear
+    #[structopt(possible_values = &KeyKind::variants(), case_insensitive = true)]
+    key: KeyKind,
 }
 
 #[derive(StructOpt, Debug, Clone)]
@@ -169,8 +203,8 @@ impl DursExecutableCoreCommand for KeysOpt {
             },
             KeysSubCommand::Clear(clear_opt) => {
                 let new_keypairs = clear_keys(
-                    clear_opt.network || clear_opt.all,
-                    clear_opt.member || clear_opt.all,
+                    clear_opt.key.is_network(),
+                    clear_opt.key.is_member(),
                     keypairs,
                 );
                 save_keypairs(profile_path, &keypairs_file, new_keypairs)