diff --git a/grpc/examples/python/greeter/README.md b/grpc/examples/python/greeter/README.md
new file mode 100644
index 0000000..fcf310c
--- /dev/null
+++ b/grpc/examples/python/greeter/README.md
@@ -0,0 +1,12 @@
+# Python Greeter example
+
+## Prerequisite
+
+- You need to have grpc python installed on your device `pip install grpcio`
+## How to run Server:
+
+- `python server.py ${PORT}`
+
+## How to run Client:
+
+- `python client.py ${PORT} ${NAME}`
\ No newline at end of file
diff --git a/grpc/examples/python/greeter/client.py b/grpc/examples/python/greeter/client.py
new file mode 100644
index 0000000..d2d7184
--- /dev/null
+++ b/grpc/examples/python/greeter/client.py
@@ -0,0 +1,40 @@
+import sys		
+import argparse
+import grpc
+
+sys.path.insert(0, '../../../../../flatbuffers/python')
+
+import flatbuffers
+from models import HelloReply, HelloRequest, greeter_grpc_fb
+
+parser = argparse.ArgumentParser()
+parser.add_argument("port", help="server port to connect to", default=3000)
+parser.add_argument("name", help="name to be sent to server", default="flatbuffers")
+
+def say_hello(stub, hello_request):
+    reply = stub.SayHello(hello_request)
+    r = HelloReply.HelloReply.GetRootAs(reply)
+    print(r.Message())
+
+def say_many_hellos(stub, hello_request):
+    greetings = stub.SayManyHellos(hello_request)
+    for greeting in greetings:
+        r = HelloReply.HelloReply.GetRootAs(greeting)
+        print(r.Message())
+
+def main():
+    args = parser.parse_args()
+
+    with grpc.insecure_channel('localhost:' + args.port) as channel:
+        builder = flatbuffers.Builder()		
+        ind = builder.CreateString(args.name)
+        HelloRequest.HelloRequestStart(builder)
+        HelloRequest.HelloRequestAddName(builder, ind)
+        root = HelloRequest.HelloRequestEnd(builder)
+        builder.Finish(root)
+        output = bytes(builder.Output())
+        stub = greeter_grpc_fb.GreeterStub(channel)
+        say_hello(stub, output)
+        say_many_hellos(stub, output)
+
+main()
\ No newline at end of file
diff --git a/grpc/examples/python/greeter/models/HelloReply.py b/grpc/examples/python/greeter/models/HelloReply.py
new file mode 100644
index 0000000..301c84d
--- /dev/null
+++ b/grpc/examples/python/greeter/models/HelloReply.py
@@ -0,0 +1,42 @@
+# automatically generated by the FlatBuffers compiler, do not modify
+
+# namespace: models
+
+import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
+
+class HelloReply(object):
+    __slots__ = ['_tab']
+
+    @classmethod
+    def GetRootAs(cls, buf, offset=0):
+        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
+        x = HelloReply()
+        x.Init(buf, n + offset)
+        return x
+
+    @classmethod
+    def GetRootAsHelloReply(cls, buf, offset=0):
+        """This method is deprecated. Please switch to GetRootAs."""
+        return cls.GetRootAs(buf, offset)
+    # HelloReply
+    def Init(self, buf, pos):
+        self._tab = flatbuffers.table.Table(buf, pos)
+
+    # HelloReply
+    def Message(self):
+        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
+        if o != 0:
+            return self._tab.String(o + self._tab.Pos)
+        return None
+
+def HelloReplyStart(builder): builder.StartObject(1)
+def Start(builder):
+    return HelloReplyStart(builder)
+def HelloReplyAddMessage(builder, message): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(message), 0)
+def AddMessage(builder, message):
+    return HelloReplyAddMessage(builder, message)
+def HelloReplyEnd(builder): return builder.EndObject()
+def End(builder):
+    return HelloReplyEnd(builder)
\ No newline at end of file
diff --git a/grpc/examples/python/greeter/models/HelloRequest.py b/grpc/examples/python/greeter/models/HelloRequest.py
new file mode 100644
index 0000000..122568f
--- /dev/null
+++ b/grpc/examples/python/greeter/models/HelloRequest.py
@@ -0,0 +1,42 @@
+# automatically generated by the FlatBuffers compiler, do not modify
+
+# namespace: models
+
+import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
+
+class HelloRequest(object):
+    __slots__ = ['_tab']
+
+    @classmethod
+    def GetRootAs(cls, buf, offset=0):
+        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
+        x = HelloRequest()
+        x.Init(buf, n + offset)
+        return x
+
+    @classmethod
+    def GetRootAsHelloRequest(cls, buf, offset=0):
+        """This method is deprecated. Please switch to GetRootAs."""
+        return cls.GetRootAs(buf, offset)
+    # HelloRequest
+    def Init(self, buf, pos):
+        self._tab = flatbuffers.table.Table(buf, pos)
+
+    # HelloRequest
+    def Name(self):
+        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
+        if o != 0:
+            return self._tab.String(o + self._tab.Pos)
+        return None
+
+def HelloRequestStart(builder): builder.StartObject(1)
+def Start(builder):
+    return HelloRequestStart(builder)
+def HelloRequestAddName(builder, name): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0)
+def AddName(builder, name):
+    return HelloRequestAddName(builder, name)
+def HelloRequestEnd(builder): return builder.EndObject()
+def End(builder):
+    return HelloRequestEnd(builder)
\ No newline at end of file
diff --git a/grpc/examples/python/greeter/models/__init__.py b/grpc/examples/python/greeter/models/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/grpc/examples/python/greeter/models/__init__.py
diff --git a/grpc/examples/python/greeter/models/greeter_grpc_fb.py b/grpc/examples/python/greeter/models/greeter_grpc_fb.py
new file mode 100644
index 0000000..b9f8a4e
--- /dev/null
+++ b/grpc/examples/python/greeter/models/greeter_grpc_fb.py
@@ -0,0 +1,52 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+
+import grpc
+
+class GreeterStub(object):
+  """ Interface exported by the server. """  
+  
+  def __init__(self, channel):
+    """ Constructor. 
+    
+    Args: 
+    channel: A grpc.Channel. 
+    """
+    
+    self.SayHello = channel.unary_unary(
+      "/models.Greeter/SayHello"
+      )
+    
+    self.SayManyHellos = channel.unary_stream(
+      "/models.Greeter/SayManyHellos"
+      )
+    
+
+class GreeterServicer(object):
+  """ Interface exported by the server. """  
+  
+  def SayHello(self, request, context):
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+  
+  
+  def SayManyHellos(self, request, context):
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+  
+  
+
+def add_GreeterServicer_to_server(servicer, server):
+  rpc_method_handlers = {
+    'SayHello': grpc.unary_unary_rpc_method_handler(
+      servicer.SayHello
+    ),
+    'SayManyHellos': grpc.unary_stream_rpc_method_handler(
+      servicer.SayManyHellos
+    ),
+  }
+  generic_handler = grpc.method_handlers_generic_handler(
+    'models.Greeter', rpc_method_handlers)
+  server.add_generic_rpc_handlers((generic_handler,))
+
diff --git a/grpc/examples/python/greeter/server.py b/grpc/examples/python/greeter/server.py
new file mode 100644
index 0000000..acca880
--- /dev/null
+++ b/grpc/examples/python/greeter/server.py
@@ -0,0 +1,57 @@
+from concurrent import futures
+import sys		
+import argparse
+import grpc
+
+sys.path.insert(0, '../../../../../flatbuffers/python')
+
+import flatbuffers
+from models import HelloReply, HelloRequest, greeter_grpc_fb
+
+parser = argparse.ArgumentParser()
+parser.add_argument("port", help="server on port", default=3000)
+
+def build_reply(message):
+    builder = flatbuffers.Builder()		
+    ind = builder.CreateString(message)
+    HelloReply.HelloReplyStart(builder)
+    HelloReply.HelloReplyAddMessage(builder, ind)
+    root = HelloReply.HelloReplyEnd(builder)
+    builder.Finish(root)
+    return bytes(builder.Output())
+
+class GreeterServicer(greeter_grpc_fb.GreeterServicer):
+
+    def __init__(self):
+        self.greetings = ["Hi", "Hallo", "Ciao"]
+
+    def SayHello(self, request, context):
+        r = HelloRequest.HelloRequest().GetRootAs(request, 0)
+        reply = "Unknown"
+        if r.Name():
+            reply = r.Name()
+        return build_reply("welcome " + reply.decode('UTF-8'))
+
+    def SayManyHellos(self, request, context):
+        r = HelloRequest.HelloRequest().GetRootAs(request, 0)
+        reply = "Unknown"
+        if r.Name():
+            reply = r.Name()
+
+        for greeting in self.greetings:
+            print(type(reply))
+            yield build_reply(greeting + " " + reply.decode('UTF-8'))
+        
+
+def serve():
+    args = parser.parse_args()
+    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
+    greeter_grpc_fb.add_GreeterServicer_to_server(
+        GreeterServicer(), server
+    )
+    server.add_insecure_port('[::]:' + args.port)
+    server.start()
+    server.wait_for_termination()
+
+if __name__ == '__main__':
+    serve()
\ No newline at end of file
