diff --git a/bin/mpw b/bin/mpw
index f5e717b..5f0d64d 100755
--- a/bin/mpw
+++ b/bin/mpw
@@ -75,10 +75,6 @@ OptionParser.new do |opts|
 		options[:clipboard] = false
 	end
 
-	opts.on('-d', '--delete', I18n.t('option.remove')) do
-		options[:delete] = true
-	end
-
 	opts.on('-e', '--export', I18n.t('option.export')) do
 		options[:export] = true
 	end
@@ -104,10 +100,6 @@ OptionParser.new do |opts|
 		exit 0
 	end
 
-	opts.on('-i', '--id ID', I18n.t('option.id')) do |id|
-		options[:id] = id
-	end
-
 	opts.on('-I', '--import', I18n.t('option.import')) do
 		options[:import] = true
 	end
@@ -136,10 +128,6 @@ OptionParser.new do |opts|
 		options[:setup] = true
 	end
 
-	opts.on('-u', '--update', I18n.t('option.update')) do
-		options[:update] = true
-	end
-
 	opts.on('-w', '--wallet WALLET', I18n.t('option.wallet')) do |wallet|
 		options[:wallet] = wallet
 	end
@@ -191,14 +179,6 @@ begin
 	
 		cli.display(opts)
 	
-	# Remove an item
-	elsif not options[:delete].nil? and not options[:id].nil?
-		cli.delete(options[:id], options[:force])
-	
-	# Update an item
-	elsif not options[:update].nil? and not options[:id].nil?
-		cli.update(options[:id])
-	
 	# Add a new item
 	elsif not options[:add].nil? and options[:key].nil?
 		cli.add
@@ -215,7 +195,7 @@ begin
 	elsif not options[:export].nil? and not options[:file].nil?
 		cli.export(options[:file])
 	
-	# Add a new item
+	# Import
 	elsif not options[:import].nil? and not options[:file].nil?
 		cli.import(options[:file])
 	
diff --git a/i18n/en.yml b/i18n/en.yml
index c704849..52fbf67 100644
--- a/i18n/en.yml
+++ b/i18n/en.yml
@@ -10,8 +10,6 @@ en:
         exception: "Can't create the GPG key!"
         name: "You must define a name for your GPG key!"
         password: "You must define a password for your GPG key!"
-    delete:
-      id_no_exist: "Can't delete the item %{id}, it doesn't exist!"
     export: "Can't export, unable to write in %{file}!"
     gpg_file: 
       decrypt: "Can't decrypt file!"
@@ -46,7 +44,6 @@ en:
     generate_password: "Generate a random password (default 8 characters)"
     group: "Search the items with specified group"
     help: "Show this help message"
-    id: "Specify an id, to use with the options [--delete | --update]"
     import: "Import item since a yaml file"
     key: "Specify the key name, to use with the options [--add | --delete | --update]"
     no_sync: "Disable synchronization with the server"
@@ -56,8 +53,6 @@ en:
     special_chars: "Use special char to generate a password"
     show: "Search and show the items"
     show_all: "List all items"
-    remove: "Delete an item"
-    update: "Update an item"
     usage: "Usage"
     wallet: "Specify a wallet to use"
 
@@ -93,7 +88,6 @@ en:
     delete_item:
       ask: "Are you sure you want to remove the item %{id} ?"
       valid: "The item %{id} has been removed!"
-      not_valid: "The item %{id} hasn't been removed, because it doesn't exist!"
     import:
       ask: "Are you sure you want to import this file %{file} ?"
       valid: "The import is succesfull!"
diff --git a/i18n/fr.yml b/i18n/fr.yml
index 41cac4d..b07a9e2 100644
--- a/i18n/fr.yml
+++ b/i18n/fr.yml
@@ -10,8 +10,6 @@ fr:
         exception: "La création de la clé GPG n'a pas pu aboutir!"
         name: "Vous devez définir un nom pour votre clé GPG!"
         password: "Vous devez définir un mot de passe pour votre clé GPG!"
-    delete:
-      id_no_exist: "Impossible de supprimer l'élément %{id}, car il n'existe pas!"
     export: "Impossible d'exporter les données dans le fichier %{file}!"
     gpg_file: 
       decrypt: "Impossible de déchiffrer le fichier GPG!"
@@ -46,7 +44,6 @@ fr:
     generate_password: "Génére un mot de passe aléatoire (défaut 8 caractères)"
     group: "Recherche les éléments appartenant au groupe spécifié"
     help: "Affiche ce message d'aide"
-    id: "Spécifie un identifiant, à utiliser avec les options [--delete | --update]"
     import: "Importe des éléments depuis un fichier yaml"
     key: "Spécifie le nom d'une clé, à utiliser avec les options [--add | --delete | --update]"
     no_sync: "Désactive la synchronisation avec le serveur"
@@ -56,8 +53,6 @@ fr:
     special_chars: "Utilise des charactères speciaux dans la génération d'un mot de passe"
     show: "Recherche et affiche les éléments"
     show_all: "Liste tous les éléments"
-    remove: "Supprime un élément"
-    update: "Met à jour un élément"
     usage: "Utilisation"
     wallet: "Spécifie le portefeuille à utiliser"
 
@@ -93,7 +88,6 @@ fr:
     delete_item:
       ask: "Êtes vous sûre de vouloir supprimer l'élément %{id} ?"
       valid: "L'élément %{id} a bien été supprimé!"
-      not_valid: "L'élément %{id} n'a pu être supprimé, car il n'existe pas!"
     import:
       ask: "Êtes vous sûre de vouloir importer le fichier %{file} ?"
       valid: "L'import est un succès!"
diff --git a/lib/mpw/cli.rb b/lib/mpw/cli.rb
index 392e7bd..50fad4d 100644
--- a/lib/mpw/cli.rb
+++ b/lib/mpw/cli.rb
@@ -21,6 +21,7 @@ require 'i18n'
 require 'colorize'
 require 'highline/import'
 require 'clipboard'
+require 'tmpdir'
 require 'mpw/item'
 require 'mpw/mpw'
 
@@ -156,7 +157,7 @@ class Cli
 			group = nil
 			i     = 1
 
-			result.sort! { |a,b| a.group.downcase <=> b.group.downcase }
+			result.sort! { |a,b| a.group.to_s.downcase <=> b.group.to_s.downcase }
 
 			result.each do |item|
 				if group != item.group
@@ -263,6 +264,12 @@ class Cli
 				Clipboard.copy(@mpw.get_otp_code(item.id))
 				puts I18n.t('form.clipboard.otp', time: @mpw.get_otp_remaining_time).yellow
 
+			when 'd', 'delete'
+				delete(item)
+
+			when 'u', 'update', 'e', 'edit'
+				update(item)
+
 			else
 				puts "----- #{I18n.t('form.clipboard.help.name')} -----".cyan
 				puts I18n.t('form.clipboard.help.login')
@@ -336,30 +343,41 @@ class Cli
 		puts "#{I18n.t('display.error')} #15: #{e}".red
 	end
 
-	# Form to add a new item
-	def add
-		options = {}
+	def text_editor(template_name, item=nil)
+		options       = {}
+		opts          = {}
+		template_file = "#{File.expand_path('../../../templates', __FILE__)}/#{template_name}.erb"
+		template      = ERB.new(IO.read(template_file))
 
-		puts I18n.t('form.add_item.title')
-		puts '--------------------'
-		options[:name]     = ask(I18n.t('form.add_item.name')).to_s
-		options[:group]    = ask(I18n.t('form.add_item.group')).to_s
-		options[:host]     = ask(I18n.t('form.add_item.server')).to_s
-		options[:protocol] = ask(I18n.t('form.add_item.protocol')).to_s
-		options[:user]     = ask(I18n.t('form.add_item.login')).to_s
-		password           = ask(I18n.t('form.add_item.password')).to_s
-		options[:port]     = ask(I18n.t('form.add_item.port')).to_s
-		options[:comment]  = ask(I18n.t('form.add_item.comment')).to_s
+		Dir.mktmpdir do |dir|
+			tmp_file = "#{dir}/#{template_name}.yml"
 
-		if @otp
-			otp_key = ask(I18n.t('form.add_item.otp_key')).to_s
+			File.open(tmp_file, 'w') do |f|
+				f << template.result(binding)
+			end
+
+			system("vim #{tmp_file}")
+
+			opts = YAML::load_file(tmp_file)
 		end
 
-		item = Item.new(options)
+		opts.delete_if { |k,v| v.to_s.empty? }
+
+		opts.each do |k,v|
+			options[k.to_sym] = v
+		end
+
+		return options
+	end
+
+	# Form to add a new item
+	def add
+		options = text_editor('add_form')	
+		item    = Item.new(options)
 
 		@mpw.add(item)
-		@mpw.set_password(item.id, password)
-		@mpw.set_otp_key(item.id, otp_key)
+		@mpw.set_password(item.id, options[:password]) if options.has_key?(:password)
+		@mpw.set_otp_key(item.id, options[:otp_key])   if options.has_key?(:otp_key)
 		@mpw.write_data
 		@mpw.sync(true) if @sync
 
@@ -368,39 +386,16 @@ class Cli
 
 	# Update an item
 	# @args: id -> the item's id
-	def update(id)
-		item = @mpw.search_by_id(id)
+	def update(item)
+		options = text_editor('update_form', item)
 
-		if not item.nil?
-			options = {}
+		item.update(options)
+		@mpw.set_password(item.id, options[:password]) if options.has_key?(:password)
+		@mpw.set_otp_key(item.id, options[:otp_key])   if options.has_key?(:otp_key)
+		@mpw.write_data
+		@mpw.sync(true) if @sync
 
-			puts I18n.t('form.update_item.title')
-			puts '--------------------'
-			options[:name]     = ask(I18n.t('form.update_item.name'    , name:     item.name)).to_s
-			options[:group]    = ask(I18n.t('form.update_item.group'   , group:    item.group)).to_s
-			options[:host]     = ask(I18n.t('form.update_item.server'  , server:   item.host)).to_s
-			options[:protocol] = ask(I18n.t('form.update_item.protocol', protocol: item.protocol)).to_s
-			options[:user]     = ask(I18n.t('form.update_item.login'   , login:    item.user)).to_s
-			password           = ask(I18n.t('form.update_item.password')).to_s
-			options[:port]     = ask(I18n.t('form.update_item.port'    , port:     item.port)).to_s
-			options[:comment]  = ask(I18n.t('form.update_item.comment' , comment:  item.comment)).to_s
-
-			if @otp
-				otp_key = ask(I18n.t('form.update_item.otp_key')).to_s
-			end
-
-			options.delete_if { |k,v| v.empty? }
-
-			item.update(options)
-			@mpw.set_password(item.id, password) if not password.empty?
-			@mpw.set_otp_key(item.id, otp_key)   if not otp_key.to_s.empty?
-			@mpw.write_data
-			@mpw.sync(true) if @sync
-
-			puts "#{I18n.t('form.update_item.valid')}".green
-		else
-			puts I18n.t('display.nothing')
-		end
+		puts "#{I18n.t('form.update_item.valid')}".green
 	rescue Exception => e
 		puts "#{I18n.t('display.error')} #14: #{e}".red
 	end
@@ -408,29 +403,18 @@ class Cli
 	# Remove an item
 	# @args: id -> the item's id
 	#        force -> no resquest a validation
-	def delete(id, force=false)
-		@clipboard = false
-		item       = @mpw.search_by_id(id)
+	def delete(item)
+		confirm = ask("#{I18n.t('form.delete_item.ask')} (y/N) ").to_s
 
-		if item.nil?
-			puts I18n.t('form.delete_item.not_valid', id: id)
+		if not confirm =~ /^(y|yes|YES|Yes|Y)$/
 			return
 		end
 
-		if not force
-			display_item(item)
-
-			confirm = ask("#{I18n.t('form.delete_item.ask', id: id)} (y/N) ").to_s
-			if not confirm =~ /^(y|yes|YES|Yes|Y)$/
-				return
-			end
-		end
-
 		item.delete
 		@mpw.write_data
 		@mpw.sync(true) if @sync
 
-		puts "#{I18n.t('form.delete_item.valid', id: id)}".green
+		puts "#{I18n.t('form.delete_item.valid')}".green
 	rescue Exception => e
 		puts "#{I18n.t('display.error')} #16: #{e}".red
 	end
diff --git a/templates/add_form.erb b/templates/add_form.erb
new file mode 100644
index 0000000..9cb9d1a
--- /dev/null
+++ b/templates/add_form.erb
@@ -0,0 +1,10 @@
+---
+name: 
+group: 
+host: 
+protocol: 
+user: 
+password: 
+port: 
+comment: 
+otp_secret: 
diff --git a/templates/update_form.erb b/templates/update_form.erb
new file mode 100644
index 0000000..13ce1d6
--- /dev/null
+++ b/templates/update_form.erb
@@ -0,0 +1,10 @@
+---
+name: <%= item.name %> 
+group: <%= item.group %>
+host: <%= item.host %>
+protocol: <%= item.protocol %>
+user: <%= item.user %>
+password: 
+port: <%= item.port %>
+comment: <%= item.comment %>
+otp_secret: