diff --git a/src/node.py b/src/node.py
index 7c171b3f2f9f62502e33fe33b2372132b6585f24..6371fd346d58febca42838ee0c03e34ea40464b9 100644
--- a/src/node.py
+++ b/src/node.py
@@ -50,7 +50,8 @@ OP_EQ = 21
 OP_POSSIBILITIES = 22
 OP_HINT = 23
 OP_REWRITE_ALL = 24
-OP_REWRITE = 25
+OP_REWRITE_ALL_VERBOSE = 25
+OP_REWRITE = 26
 
 # Special identifiers
 PI = 'pi'
@@ -90,8 +91,9 @@ OP_MAP = {
         '=': OP_EQ,
         '??': OP_POSSIBILITIES,
         '?': OP_HINT,
-        '@@': OP_REWRITE_ALL,
         '@': OP_REWRITE,
+        '@@': OP_REWRITE_ALL,
+        '@@@': OP_REWRITE_ALL_VERBOSE,
         }
 
 OP_VALUE_MAP = dict([(v, k) for k, v in OP_MAP.iteritems()])
@@ -120,8 +122,9 @@ TOKEN_MAP = {
         OP_EQ: 'EQ',
         OP_POSSIBILITIES: 'POSSIBILITIES',
         OP_HINT: 'HINT',
-        OP_REWRITE_ALL: 'REWRITE_ALL',
         OP_REWRITE: 'REWRITE',
+        OP_REWRITE_ALL: 'REWRITE_ALL',
+        OP_REWRITE_ALL_VERBOSE: 'REWRITE_ALL_VERBOSE',
         }
 
 
diff --git a/src/parser.py b/src/parser.py
index 9ac185a5ec7942f75e3952921075b00c82357982..49e2eac82f93ff0c5250fa5542ba730d64b27a33 100644
--- a/src/parser.py
+++ b/src/parser.py
@@ -261,7 +261,7 @@ class Parser(BisonParser):
         for i, p in enumerate(self.possibilities):
             print '%d %s' % (i, p)
 
-    def rewrite(self, index=0):
+    def rewrite(self, index=0, verbose=False):
         self.find_possibilities()
 
         if not self.possibilities:
@@ -271,26 +271,33 @@ class Parser(BisonParser):
 
         if self.verbose:
             print 'Applying suggestion:', suggestion
+        elif verbose:
+            print suggestion
 
         expression = apply_suggestion(self.root_node, suggestion)
 
         if self.verbose:
             print 'After application:  ', expression
+        elif verbose:
+            print expression
 
         self.set_root_node(expression)
 
         return True
 
-    def rewrite_all(self):
+    def rewrite_all(self, verbose=False):
         i = 0
 
-        while self.rewrite():
+        while self.rewrite(verbose=verbose):
             i += 1
 
             if i > 100:
                 print 'Too many rewrite steps, aborting...'
                 break
 
+        if not verbose:
+            return self.root_node
+
     #def hook_run(self, filename, retval):
     #    return retval
 
@@ -331,6 +338,7 @@ class Parser(BisonParser):
              | REWRITE NEWLINE
              | REWRITE NUMBER NEWLINE
              | REWRITE_ALL NEWLINE
+             | REWRITE_ALL_VERBOSE NEWLINE
              | RAISE NEWLINE
         """
         if option in (1, 2):  # rule: {exp,debug} NEWLINE
@@ -353,11 +361,10 @@ class Parser(BisonParser):
             self.rewrite(int(values[1]))
             return self.root_node
 
-        if option == 7:  # rule: REWRITE_ALL NEWLINE
-            self.rewrite_all()
-            return self.root_node
+        if option in (7, 8):  # rule: REWRITE_ALL NEWLINE
+            return self.rewrite_all(verbose=(option == 8))
 
-        if option == 8:
+        if option == 9:
             raise RuntimeError('on_line: exception raised')
 
     def on_debug(self, target, option, names, values):