diff --git a/smalltalk-mode.el b/smalltalk-mode.el
index 20c9fa7..8050b8e 100644
--- a/smalltalk-mode.el
+++ b/smalltalk-mode.el
@@ -1,3 +1,4 @@
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;
 ;;; Copyright 1988-92, 1994-95, 1999, 2000, 2003, 2007, 2008, 2009
@@ -99,6 +100,7 @@
     table)
   "Syntax table used by Smalltalk mode")
 
+
 ;; ---[ Abbrev table ]------------------------------------------------
 
 (defvar smalltalk-mode-abbrev-table nil
@@ -137,6 +139,29 @@
     keymap)  
   "Keymap for Smalltalk mode")
 
+(defun smalltalk-valid-key-stringp (key)
+  (and key
+	   (stringp key)
+	   (not (string= key ""))))
+
+(defun smalltalk-next-block-key-reload (&optional unbind)
+  (when (smalltalk-valid-key-stringp unbind)
+	(define-key smalltalk-mode-map (read-kbd-macro unbind) nil))
+  (when (smalltalk-valid-key-stringp smalltalk-next-block)
+    (define-key smalltalk-mode-map (read-kbd-macro smalltalk-next-block) 'smalltalk-bang)))
+
+(defcustom smalltalk-next-block "!"
+  "This key is bound to `smalltalk-bang'
+Value is a string that is convert to the internal Emacs key
+representation using `read-kbd-macro'."
+  :type 'string
+  :group 'smalltalk
+  :set #'(lambda (symbol key)
+		   (let ((old (and (boundp symbol)
+				  (symbol-value symbol))))
+			 (set-default symbol key)
+			 (smalltalk-next-block-key-reload old))))
+
 (defconst smalltalk-binsel "\\([-+*/~,<>=&?]\\{1,2\\}\\|:=\\|||\\)"
   "Smalltalk binary selectors")
 
@@ -178,6 +203,7 @@
   (setq mode-name "Smalltalk")
 
   (use-local-map smalltalk-mode-map)
+  (smalltalk-next-block-key-reload)
   (set-syntax-table smalltalk-mode-syntax-table)
   (setq local-abbrev-table smalltalk-mode-abbrev-table)
   
