diff --git a/autoload/magit/sign.vim b/autoload/magit/sign.vim
index f979d8b118fc60176d35121f6f4fcc94f06ad0bb..646347a938d2d11cd0daf162a793dda10c5a8d25 100644
--- a/autoload/magit/sign.vim
+++ b/autoload/magit/sign.vim
@@ -19,11 +19,22 @@ let s:bufnr = bufnr(g:magit_buffer_name)
 function! magit#sign#remove_signs(sign_ids)
     let bufnr = magit#utils#bufnr()
     for sign in values(a:sign_ids)
-        echom "sign unplace" sign.id
         execute "sign unplace" sign.id
     endfor
 endfunction
 
+function! magit#sign#add_sign(line, type, bufnr)
+	let id = <SID>get_next_sign_id()
+	execute ":sign place " . id .
+		\ " line=" . a:line . " name=" . s:magit_mark_signs[a:type] .
+		\ " buffer=" . a:bufnr
+	return id
+endfunction
+
+function! magit#sign#remove_sign(id)
+	execute ":sign unplace " . a:id
+endfunction
+
 " s:get_next_sign_id: helper function to increment sign ids
 function! s:get_next_sign_id()
 	let next_id = s:next_sign_id
@@ -65,31 +76,32 @@ endfunction
 " param[in] startline,endline: range of lines
 " return Dict of marked lines
 function! magit#sign#find_stage_signs(startline, endline)
-	return magit#sign#find_signs(s:magit_mark_sign, a:startline, a:endline)
+	return magit#sign#find_signs(s:magit_mark_signs.M, a:startline, a:endline)
 endfunction
 
 " s:magit_mark_sign: string of the sign for lines to be staged
-let s:magit_mark_sign='MagitMark'
+let s:magit_mark_signs = {'M': 'MagitTBS', 'S': 'MagitBS', 'E': 'MagitBE'}
 
 " magit#sign#init: initializer function for signs
 function! magit#sign#init()
-	execute "sign define " . s:magit_mark_sign . " text=S> linehl=Visual"
+	execute "sign define " . s:magit_mark_signs.M . " text=S> linehl=Visual"
+	execute "sign define " . s:magit_mark_signs.S
+	execute "sign define " . s:magit_mark_signs.E
 endfunction
 
 " magit#sign#toggle_signs: toggle marks for range of lines
 " marked lines are unmarked, non marked are marked
+" param[in] type; type of sign to toggle (see s:magit_mark_signs)
 " param[in] startline,endline: range of lines
-function! magit#sign#toggle_signs(startline, endline)
+function! magit#sign#toggle_signs(type, startline, endline)
 	let bufnr = magit#utils#bufnr()
-	let current_signs = magit#sign#find_signs(s:magit_mark_sign, a:startline, a:endline)
+	let current_signs = magit#sign#find_signs(s:magit_mark_signs[a:type], a:startline, a:endline)
 	let line = a:startline
 	while ( line <= a:endline )
 		if ( has_key(current_signs, line) == 0 )
-			execute ":sign place " . <SID>get_next_sign_id() .
-				\ " line=" . line . " name=" . s:magit_mark_sign .
-				\ " buffer=" . bufnr
+			call magit#sign#add_sign(line, a:type, bufnr)
 		else
-			execute ":sign unplace " . current_signs[line].id
+			call magit#sign#remove_sign(current_signs[line].id)
 		endif
 		let line += 1
 	endwhile
diff --git a/plugin/magit.vim b/plugin/magit.vim
index 30314494705aedff505f3534ea096d7d517199ec..192dc27d9ae6f01e6deae96de09006f9abef50a2 100644
--- a/plugin/magit.vim
+++ b/plugin/magit.vim
@@ -489,7 +489,7 @@ function! s:mg_mark_lines_in_hunk(start_select_line, end_select_line)
 	if ( a:start_select_line < starthunk || a:end_select_line > endhunk )
 		throw 'out of hunk selection'
 	endif
-	return magit#sign#toggle_signs(a:start_select_line, a:end_select_line)
+	return magit#sign#toggle_signs('M', a:start_select_line, a:end_select_line)
 endfunction
 
 " s:mg_get_section: helper function to get the current section, according to