diff --git a/IPython/html/static/notebook/js/widgets/string.js b/IPython/html/static/notebook/js/widgets/string.js
index d7c2482..f221d8d 100644
--- a/IPython/html/static/notebook/js/widgets/string.js
+++ b/IPython/html/static/notebook/js/widgets/string.js
@@ -132,7 +132,8 @@ define(["notebook/js/widget"], function(widget_manager){
         
         events: {"keyup input" : "handleChanging",
                 "paste input" : "handleChanging",
-                "cut input" : "handleChanging"},
+                "cut input" : "handleChanging",
+                "keypress input" : "handleKeypress"},
         
         // Handles and validates user input.
         handleChanging: function(e) { 
@@ -141,6 +142,16 @@ define(["notebook/js/widget"], function(widget_manager){
             this.model.update_other_views(this);
             this.user_invoked_update = false;
         },
+        
+        // Handles text submition
+        handleKeypress: function(e) { 
+            if (e.keyCode == 13) { // Return key
+                this.user_invoked_update = true;
+                this.model.set('submits', this.model.get('submits') + 1);
+                this.model.update_other_views(this);
+                this.user_invoked_update = false;
+            }
+        },
     });
 
     widget_manager.register_widget_view('TextBoxView', TextBoxView);
diff --git a/IPython/html/widgets/widget_string.py b/IPython/html/widgets/widget_string.py
index f603956..2ddad4e 100644
--- a/IPython/html/widgets/widget_string.py
+++ b/IPython/html/widgets/widget_string.py
@@ -13,8 +13,11 @@ Represents a unicode string using a widget.
 #-----------------------------------------------------------------------------
 # Imports
 #-----------------------------------------------------------------------------
+import inspect
+import types
+
 from .widget import Widget
-from IPython.utils.traitlets import Unicode, Bool, List
+from IPython.utils.traitlets import Unicode, Bool, List, Int
 
 #-----------------------------------------------------------------------------
 # Classes
@@ -24,7 +27,53 @@ class StringWidget(Widget):
     default_view_name = Unicode('TextBoxView')
 
     # Keys
-    _keys = ['value', 'disabled', 'description']
+    _keys = ['value', 'disabled', 'description', 'submits']
     value = Unicode(help="String value")
     disabled = Bool(False, help="Enable or disable user changes")
     description = Unicode(help="Description of the value this widget represents")
+    submits = Int(0, help="Used to capture and fire submission ")
+
+
+    def __init__(self, **kwargs):
+        super(StringWidget, self).__init__(**kwargs)
+        self._submission_callbacks = []
+
+
+    def on_submit(self, callback, remove=False):
+        """Register a callback to handle text submission (triggered when the 
+        user clicks enter).
+
+        Parameters
+        callback: Method handle
+            Function to be called when the text has been submitted.  Function
+            can have two possible signatures:
+            callback()
+            callback(sender)
+        remove: bool (optional)
+            Whether or not to unregister the callback"""
+        if remove and callback in self._submission_callbacks:
+            self._submission_callbacks.remove(callback)
+        elif not remove and not callback in self._submission_callbacks:
+            self._submission_callbacks.append(callback)
+
+
+    def _submits_changed(self, name, old_value, new_value):
+        """Handles when a string widget view is submitted."""
+        if new_value > old_value:
+            for handler in self._submission_callbacks:
+                if callable(handler):
+                    argspec = inspect.getargspec(handler)
+                    nargs = len(argspec[0])
+
+                    # Bound methods have an additional 'self' argument
+                    if isinstance(handler, types.MethodType):
+                        nargs -= 1
+
+                    # Call the callback
+                    if nargs == 0:
+                        handler()
+                    elif nargs == 1:
+                        handler(self)
+                    else:
+                        raise TypeError('StringWidget submit callback must ' \
+                            'accept 0 or 1 arguments.')