Index: twisted/topfiles/4386.bugfix
===================================================================
--- twisted/topfiles/4386.bugfix	(revision 0)
+++ twisted/topfiles/4386.bugfix	(revision 0)
@@ -0,0 +1,2 @@
+twisted.internet.abstract.FileDescriptor implements twisted.internet.interfaces.IPushProducer instead of twisted.internet.interfaces.IProducer.
+twisted.internet.iocpreactor.abstract.FileHandle implements twisted.internet.interfaces.IPushProducer instead of twisted.internet.interfaces.IProducer.
Index: twisted/internet/abstract.py
===================================================================
--- twisted/internet/abstract.py	(revision 33568)
+++ twisted/internet/abstract.py	(working copy)
@@ -155,7 +155,7 @@
 
     SEND_LIMIT = 128*1024
 
-    implements(interfaces.IProducer, interfaces.IReadWriteDescriptor,
+    implements(interfaces.IPushProducer, interfaces.IReadWriteDescriptor,
                interfaces.IConsumer, interfaces.ITransport, interfaces.IHalfCloseableDescriptor)
 
     def __init__(self, reactor=None):
Index: twisted/internet/iocpreactor/abstract.py
===================================================================
--- twisted/internet/iocpreactor/abstract.py	(revision 33568)
+++ twisted/internet/iocpreactor/abstract.py	(working copy)
@@ -22,7 +22,7 @@
     """
     File handle that can read and write asynchronously
     """
-    implements(interfaces.IProducer, interfaces.IConsumer,
+    implements(interfaces.IPushProducer, interfaces.IConsumer,
                interfaces.ITransport, interfaces.IHalfCloseableDescriptor)
     # read stuff
     maxReadBuffers = 16
Index: twisted/internet/test/test_iocp.py
===================================================================
--- twisted/internet/test/test_iocp.py	(revision 33568)
+++ twisted/internet/test/test_iocp.py	(working copy)
@@ -14,12 +14,14 @@
 
 from twisted.trial import unittest
 from twisted.python.log import msg
+from twisted.internet.interfaces import IPushProducer
 
 try:
     from twisted.internet.iocpreactor import iocpsupport as _iocp, tcp, udp
     from twisted.internet.iocpreactor.reactor import IOCPReactor, EVENTS_PER_LOOP, KEY_NORMAL
     from twisted.internet.iocpreactor.interfaces import IReadWriteHandle
     from twisted.internet.iocpreactor.const import SO_UPDATE_ACCEPT_CONTEXT
+    from twisted.internet.iocpreactor.abstract import FileHandle
 except ImportError:
     skip = 'This test only applies to IOCPReactor'
 
@@ -117,6 +119,13 @@
         verifyClass(IReadWriteHandle, udp.Port)
 
 
+    def test_fileHandleInterfaces(self):
+        """
+        Verify that L{Filehandle} implements L{IPushProducer}.
+        """
+        verifyClass(IPushProducer, FileHandle)
+
+
     def test_maxEventsPerIteration(self):
         """
         Verify that we don't lose an event when more than EVENTS_PER_LOOP
Index: twisted/internet/test/test_filedescriptor.py
===================================================================
--- twisted/internet/test/test_filedescriptor.py	(revision 33568)
+++ twisted/internet/test/test_filedescriptor.py	(working copy)
@@ -5,14 +5,17 @@
 Whitebox tests for L{twisted.internet.abstract.FileDescriptor}.
 """
 
+from zope.interface.verify import verifyClass
+
 from twisted.internet.abstract import FileDescriptor
+from twisted.internet.interfaces import IPushProducer
 from twisted.trial.unittest import TestCase
 
 
 
-class FileDescriptorWriteSequenceTests(TestCase):
+class FileDescriptorTests(TestCase):
     """
-    Tests for L{FileDescriptor.writeSequence}.
+    Tests for L{FileDescriptor}.
     """
     def test_writeWithUnicodeRaisesException(self):
         """
@@ -29,3 +32,10 @@
         fileDescriptor = FileDescriptor()
         self.assertRaises(
             TypeError, fileDescriptor.writeSequence, ['foo', u'bar', 'baz'])
+
+
+    def test_implementInterfaceIPushProducer(self):
+        """
+        L{FileDescriptor} should implement L{IPushProducer}.
+        """
+        self.assertTrue(verifyClass(IPushProducer, FileDescriptor))
