diff --git twisted/internet/base.py twisted/internet/base.py
index 69dd3b4..d96bcbf 100644
--- twisted/internet/base.py
+++ twisted/internet/base.py
@@ -471,6 +471,7 @@ class ReactorBase(object):
         self.running = False
         self._started = False
         self._justStopped = False
+        self._startedBefore = False
         # reactor internal readers, e.g. the waker.
         self._internalReaders = set()
         self.waker = None
@@ -570,6 +571,7 @@ class ReactorBase(object):
                 "Can't stop reactor that isn't running.")
         self._stopped = True
         self._justStopped = True
+        self._startedBefore = True
 
 
     def crash(self):
@@ -668,6 +670,8 @@ class ReactorBase(object):
         """
         if self._started:
             raise error.ReactorAlreadyRunning()
+        if self._startedBefore:
+            raise error.ReactorNotRestartable()
         self._started = True
         self._stopped = False
         threadable.registerAsIOThread()
diff --git twisted/internet/error.py twisted/internet/error.py
index aa40faf..47667c0 100644
--- twisted/internet/error.py
+++ twisted/internet/error.py
@@ -350,6 +350,12 @@ class ReactorNotRunning(RuntimeError):
     """
 
 
+class ReactorNotRestartable(RuntimeError):
+    """
+    Error raised when trying to run a reactor which was stopped.
+    """
+
+
 
 class ReactorAlreadyRunning(RuntimeError):
     """
diff --git twisted/internet/test/test_core.py twisted/internet/test/test_core.py
index 75592b4..6eb7aaa 100644
--- twisted/internet/test/test_core.py
+++ twisted/internet/test/test_core.py
@@ -12,7 +12,7 @@ import time
 import inspect
 
 from twisted.internet.abstract import FileDescriptor
-from twisted.internet.error import ReactorAlreadyRunning
+from twisted.internet.error import ReactorAlreadyRunning, ReactorNotRestartable
 from twisted.internet.defer import Deferred
 from twisted.internet.test.reactormixins import ReactorBuilder
 
@@ -310,5 +310,22 @@ class SystemEventTestsBuilder(ReactorBuilder):
         self.assertEqual(events, ['crash', ('stop', True)])
 
 
+    def test_runAfterStop(self):
+        """
+        C{reactor.run()} raises L{ReactorNotRestartable} when called when
+        the reactor is being run after getting stopped priorly.
+        """
+        events = []
+        def restart():
+            self.assertRaises(ReactorNotRestartable, reactor.run)
+            events.append('tested')
+        reactor = self.buildReactor()
+        reactor.callWhenRunning(reactor.stop)
+        reactor.addSystemEventTrigger('after', 'shutdown', restart)
+        reactor.run()
+        self.assertEqual(events, ['tested'])
+
+
+
 globals().update(SystemEventTestsBuilder.makeTestCaseClasses())
 globals().update(ObjectModelIntegrationTest.makeTestCaseClasses())
