diff --git a/tutorial/py.twisted/PythonClient.py b/tutorial/py.twisted/PythonClient.py
new file mode 100755
index 0000000..27a3d53
--- /dev/null
+++ b/tutorial/py.twisted/PythonClient.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+import sys
+sys.path.append('../gen-py')
+
+from tutorial import Calculator
+from tutorial.ttypes import *
+
+from twisted.internet.defer import inlineCallbacks
+from twisted.internet import reactor
+from twisted.internet.protocol import ClientCreator
+
+from thrift import Thrift
+from thrift.transport import TTwisted
+from thrift.protocol import TBinaryProtocol
+
+@inlineCallbacks
+def main(client):
+  yield client.ping()
+  print 'ping()'
+
+  sum = yield client.add(1,1)
+  print '1+1=%d' % (sum)
+
+  work = Work()
+
+  work.op = Operation.DIVIDE
+  work.num1 = 1
+  work.num2 = 0
+
+  try:
+    quotient = yield client.calculate(1, work)
+    print 'Whoa? You know how to divide by zero?'
+  except InvalidOperation, io:
+    print 'InvalidOperation: %r' % io
+
+  work.op = Operation.SUBTRACT
+  work.num1 = 15
+  work.num2 = 10
+
+  diff = yield client.calculate(1, work)
+  print '15-10=%d' % (diff)
+
+  log = yield client.getStruct(1)
+  print 'Check log: %s' % (log.value)
+  reactor.stop()
+
+if __name__ == '__main__':
+    d = ClientCreator(reactor,
+                      TTwisted.ThriftClientProtocol,
+                      Calculator.Client,
+                      TBinaryProtocol.TBinaryProtocolFactory(),
+                      ).connectTCP("127.0.0.1", 9090)
+    d.addCallback(lambda conn: conn.client)
+    d.addCallback(main)
+
+    reactor.run()
diff --git a/tutorial/py.twisted/PythonServer.py b/tutorial/py.twisted/PythonServer.py
new file mode 100755
index 0000000..6130b92
--- /dev/null
+++ b/tutorial/py.twisted/PythonServer.py
@@ -0,0 +1,92 @@
+#!/usr/bin/env python
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+import sys
+sys.path.append('../gen-py.twisted')
+
+from tutorial import Calculator
+from tutorial.ttypes import *
+
+from shared.ttypes import SharedStruct
+
+from zope.interface import implements
+from twisted.internet import reactor
+
+from thrift.transport import TTwisted
+from thrift.protocol import TBinaryProtocol
+from thrift.server import TServer
+
+class CalculatorHandler:
+  implements(Calculator.Iface)  
+  def __init__(self):
+    self.log = {}
+
+  def ping(self):
+    print 'ping()'
+
+  def add(self, n1, n2):
+    print 'add(%d,%d)' % (n1, n2)
+    return n1+n2
+
+  def calculate(self, logid, work):
+    print 'calculate(%d, %r)' % (logid, work)
+
+    if work.op == Operation.ADD:
+      val = work.num1 + work.num2
+    elif work.op == Operation.SUBTRACT:
+      val = work.num1 - work.num2
+    elif work.op == Operation.MULTIPLY:
+      val = work.num1 * work.num2
+    elif work.op == Operation.DIVIDE:
+      if work.num2 == 0:
+        x = InvalidOperation()
+        x.what = work.op
+        x.why = 'Cannot divide by 0'
+        raise x
+      val = work.num1 / work.num2
+    else:
+      x = InvalidOperation()
+      x.what = work.op
+      x.why = 'Invalid operation'
+      raise x
+
+    log = SharedStruct()
+    log.key = logid
+    log.value = '%d' % (val)
+    self.log[logid] = log
+
+    return val
+
+  def getStruct(self, key):
+    print 'getStruct(%d)' % (key)
+    return self.log[key]
+
+  def zip(self):
+    print 'zip()'
+
+if __name__ == '__main__':
+    handler = CalculatorHandler()
+    processor = Calculator.Processor(handler)
+    pfactory = TBinaryProtocol.TBinaryProtocolFactory()
+    server = reactor.listenTCP(9090,
+                TTwisted.ThriftServerFactory(processor,
+                pfactory), interface="127.0.0.1")
+    reactor.run()
diff --git a/tutorial/py.twisted/PythonServer.tac b/tutorial/py.twisted/PythonServer.tac
new file mode 100755
index 0000000..11f0f8f
--- /dev/null
+++ b/tutorial/py.twisted/PythonServer.tac
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+from twisted.application import internet, service
+from thrift.transport import TTwisted
+
+import sys
+sys.path.append('../gen-py.twisted')
+from tutorial import Calculator
+from tutorial.ttypes import *
+from PythonServer import CalculatorHandler
+
+def make_application():
+    application = service.Application('CalcServer')
+
+    handler = CalculatorHandler()
+    processor = Calculator.Processor(handler)
+
+    serverFactory = TTwisted.ThriftServerFactory(processor,
+                                 TBinaryProtocol.TBinaryProtocolFactory())
+
+    calcService = internet.TCPServer(9090, serverFactory)
+
+    multiService = service.MultiService()
+    calcService.setServiceParent(multiService)
+    multiService.setServiceParent(application)
+
+    return application
+
+application = make_application()
