diff --git a/IPython/core/history.py b/IPython/core/history.py
index 90b2b67..9a33ad2 100644
--- a/IPython/core/history.py
+++ b/IPython/core/history.py
@@ -630,18 +630,20 @@ def magic_rerun(self, parameter_s=''):
     opts, args = self.parse_options(parameter_s, 'l:g:', mode='string')
     if "l" in opts:         # Last n lines
         n = int(opts['l'])
-        hist = self.history_manager.get_hist_tail(n, raw=False)
+        hist = self.history_manager.get_hist_tail(n)
     elif "g" in opts:       # Search
         p = "*"+opts['g']+"*"
-        hist = self.history_manager.get_hist_search(p, raw=False)
-        hist = list(hist)
-        if 'magic("rerun' in hist[-1][2]:
-            hist = hist[:-1]   # We can ignore the current line
-        hist = hist[-1:]       # Just get the last match
+        hist = list(self.history_manager.get_hist_search(p))
+        for l in reversed(hist):
+            if "rerun" not in l[2]:
+                hist = [l]     # The last match which isn't a %rerun
+                break
+        else:
+            hist = []          # No matches except %rerun
     elif args:              # Specify history ranges
         hist = self.history_manager.get_hist_from_rangestr(args)
     else:                   # Last line
-        hist = self.history_manager.get_hist_tail(1, raw=False)
+        hist = self.history_manager.get_hist_tail(1)
     hist = [x[2] for x in hist]
     if not hist:
         print("No lines in history match specification")
@@ -650,7 +652,7 @@ def magic_rerun(self, parameter_s=''):
     print("=== Executing: ===")
     print(histlines)
     print("=== Output: ===")
-    self.run_source("\n".join(hist), symbol="exec")
+    self.run_cell("\n".join(hist), store_history=False)
 
 
 def init_ipython(ip):
diff --git a/IPython/core/interactiveshell.py b/IPython/core/interactiveshell.py
index 84d7707..818eab6 100644
--- a/IPython/core/interactiveshell.py
+++ b/IPython/core/interactiveshell.py
@@ -2060,7 +2060,7 @@ class InteractiveShell(Configurable, Magic):
                 self.showtraceback()
                 warn('Unknown failure executing file: <%s>' % fname)
 
-    def run_cell(self, cell):
+    def run_cell(self, cell, store_history=True):
         """Run the contents of an entire multiline 'cell' of code, and store it
         in the history.
 
@@ -2111,7 +2111,9 @@ class InteractiveShell(Configurable, Magic):
         cell = ''.join(blocks)
 
         # Store raw and processed history
-        self.history_manager.store_inputs(self.execution_count, cell, raw_cell)
+        if store_history:
+            self.history_manager.store_inputs(self.execution_count, 
+                                                        cell, raw_cell)
 
         self.logger.log(cell, raw_cell)
 
@@ -2123,9 +2125,10 @@ class InteractiveShell(Configurable, Magic):
                 out = self.run_source(blocks[0])
                 # Write output to the database. Does nothing unless
                 # history output logging is enabled.
-                self.history_manager.store_output(self.execution_count)
-                # since we return here, we need to update the execution count
-                self.execution_count += 1
+                if store_history:
+                    self.history_manager.store_output(self.execution_count)
+                    # since we return here, we need to update the execution count
+                    self.execution_count += 1
                 return out
 
             # In multi-block input, if the last block is a simple (one-two
@@ -2154,9 +2157,10 @@ class InteractiveShell(Configurable, Magic):
 
         # Write output to the database. Does nothing unless
         # history output logging is enabled.
-        self.history_manager.store_output(self.execution_count)
-        # Each cell is a *single* input, regardless of how many lines it has
-        self.execution_count += 1
+        if store_history:
+            self.history_manager.store_output(self.execution_count)
+            # Each cell is a *single* input, regardless of how many lines it has
+            self.execution_count += 1
 
     # PENDING REMOVAL: this method is slated for deletion, once our new
     # input logic has been 100% moved to frontends and is stable.
diff --git a/IPython/core/magic.py b/IPython/core/magic.py
index 1a4862e..b1aed58 100644
--- a/IPython/core/magic.py
+++ b/IPython/core/magic.py
@@ -2369,7 +2369,8 @@ Currently the magic system has the following functions:\n"""
         else:
             print 'done. Executing edited code...'
             if opts_raw:
-                self.shell.run_cell(file_read(filename))
+                self.shell.run_cell(file_read(filename),
+                                                    store_history=False)
             else:
                 self.shell.safe_execfile(filename,self.shell.user_ns,
                                          self.shell.user_ns)