diff --git a/proto/health.proto b/proto/health.proto
new file mode 100644
index 0000000000000000000000000000000000000000..378db950b3b49332ad990aa4aea499179bbe5035
--- /dev/null
+++ b/proto/health.proto
@@ -0,0 +1,24 @@
+syntax = "proto3";
+
+package grpc.health.v1;
+
+message HealthCheckRequest {
+  string service = 1;
+}
+
+message HealthCheckResponse {
+  enum ServingStatus {
+    UNKNOWN = 0;
+    SERVING = 1;
+    NOT_SERVING = 2;
+    SERVICE_UNKNOWN = 3;  // Used only by the Watch method.
+  }
+  ServingStatus status = 1;
+}
+
+service Health {
+  rpc Check(HealthCheckRequest) returns (HealthCheckResponse);
+
+  rpc Watch(HealthCheckRequest) returns (stream HealthCheckResponse);
+}
+
diff --git a/proto/src/health_pb2.py b/proto/src/health_pb2.py
new file mode 100644
index 0000000000000000000000000000000000000000..3cd84818dd84509d2c580ffa5d5aaf2df0ea9ee9
--- /dev/null
+++ b/proto/src/health_pb2.py
@@ -0,0 +1,175 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: health.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='health.proto',
+  package='grpc.health.v1',
+  syntax='proto3',
+  serialized_options=None,
+  serialized_pb=_b('\n\x0chealth.proto\x12\x0egrpc.health.v1\"%\n\x12HealthCheckRequest\x12\x0f\n\x07service\x18\x01 \x01(\t\"\xa9\x01\n\x13HealthCheckResponse\x12\x41\n\x06status\x18\x01 \x01(\x0e\x32\x31.grpc.health.v1.HealthCheckResponse.ServingStatus\"O\n\rServingStatus\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0b\n\x07SERVING\x10\x01\x12\x0f\n\x0bNOT_SERVING\x10\x02\x12\x13\n\x0fSERVICE_UNKNOWN\x10\x03\x32\xae\x01\n\x06Health\x12P\n\x05\x43heck\x12\".grpc.health.v1.HealthCheckRequest\x1a#.grpc.health.v1.HealthCheckResponse\x12R\n\x05Watch\x12\".grpc.health.v1.HealthCheckRequest\x1a#.grpc.health.v1.HealthCheckResponse0\x01\x62\x06proto3')
+)
+
+
+
+_HEALTHCHECKRESPONSE_SERVINGSTATUS = _descriptor.EnumDescriptor(
+  name='ServingStatus',
+  full_name='grpc.health.v1.HealthCheckResponse.ServingStatus',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='UNKNOWN', index=0, number=0,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='SERVING', index=1, number=1,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='NOT_SERVING', index=2, number=2,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='SERVICE_UNKNOWN', index=3, number=3,
+      serialized_options=None,
+      type=None),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=162,
+  serialized_end=241,
+)
+_sym_db.RegisterEnumDescriptor(_HEALTHCHECKRESPONSE_SERVINGSTATUS)
+
+
+_HEALTHCHECKREQUEST = _descriptor.Descriptor(
+  name='HealthCheckRequest',
+  full_name='grpc.health.v1.HealthCheckRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='service', full_name='grpc.health.v1.HealthCheckRequest.service', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=32,
+  serialized_end=69,
+)
+
+
+_HEALTHCHECKRESPONSE = _descriptor.Descriptor(
+  name='HealthCheckResponse',
+  full_name='grpc.health.v1.HealthCheckResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='grpc.health.v1.HealthCheckResponse.status', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _HEALTHCHECKRESPONSE_SERVINGSTATUS,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=72,
+  serialized_end=241,
+)
+
+_HEALTHCHECKRESPONSE.fields_by_name['status'].enum_type = _HEALTHCHECKRESPONSE_SERVINGSTATUS
+_HEALTHCHECKRESPONSE_SERVINGSTATUS.containing_type = _HEALTHCHECKRESPONSE
+DESCRIPTOR.message_types_by_name['HealthCheckRequest'] = _HEALTHCHECKREQUEST
+DESCRIPTOR.message_types_by_name['HealthCheckResponse'] = _HEALTHCHECKRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+HealthCheckRequest = _reflection.GeneratedProtocolMessageType('HealthCheckRequest', (_message.Message,), {
+  'DESCRIPTOR' : _HEALTHCHECKREQUEST,
+  '__module__' : 'health_pb2'
+  # @@protoc_insertion_point(class_scope:grpc.health.v1.HealthCheckRequest)
+  })
+_sym_db.RegisterMessage(HealthCheckRequest)
+
+HealthCheckResponse = _reflection.GeneratedProtocolMessageType('HealthCheckResponse', (_message.Message,), {
+  'DESCRIPTOR' : _HEALTHCHECKRESPONSE,
+  '__module__' : 'health_pb2'
+  # @@protoc_insertion_point(class_scope:grpc.health.v1.HealthCheckResponse)
+  })
+_sym_db.RegisterMessage(HealthCheckResponse)
+
+
+
+_HEALTH = _descriptor.ServiceDescriptor(
+  name='Health',
+  full_name='grpc.health.v1.Health',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  serialized_start=244,
+  serialized_end=418,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Check',
+    full_name='grpc.health.v1.Health.Check',
+    index=0,
+    containing_service=None,
+    input_type=_HEALTHCHECKREQUEST,
+    output_type=_HEALTHCHECKRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Watch',
+    full_name='grpc.health.v1.Health.Watch',
+    index=1,
+    containing_service=None,
+    input_type=_HEALTHCHECKREQUEST,
+    output_type=_HEALTHCHECKRESPONSE,
+    serialized_options=None,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_HEALTH)
+
+DESCRIPTOR.services_by_name['Health'] = _HEALTH
+
+# @@protoc_insertion_point(module_scope)
diff --git a/proto/src/health_pb2_grpc.py b/proto/src/health_pb2_grpc.py
new file mode 100644
index 0000000000000000000000000000000000000000..7f299d050c20dacb45b33b7ccd6396cb93e5a352
--- /dev/null
+++ b/proto/src/health_pb2_grpc.py
@@ -0,0 +1,63 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+import grpc
+
+import health_pb2 as health__pb2
+
+
+class HealthStub(object):
+  # missing associated documentation comment in .proto file
+  pass
+
+  def __init__(self, channel):
+    """Constructor.
+
+    Args:
+      channel: A grpc.Channel.
+    """
+    self.Check = channel.unary_unary(
+        '/grpc.health.v1.Health/Check',
+        request_serializer=health__pb2.HealthCheckRequest.SerializeToString,
+        response_deserializer=health__pb2.HealthCheckResponse.FromString,
+        )
+    self.Watch = channel.unary_stream(
+        '/grpc.health.v1.Health/Watch',
+        request_serializer=health__pb2.HealthCheckRequest.SerializeToString,
+        response_deserializer=health__pb2.HealthCheckResponse.FromString,
+        )
+
+
+class HealthServicer(object):
+  # missing associated documentation comment in .proto file
+  pass
+
+  def Check(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def Watch(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+
+def add_HealthServicer_to_server(servicer, server):
+  rpc_method_handlers = {
+      'Check': grpc.unary_unary_rpc_method_handler(
+          servicer.Check,
+          request_deserializer=health__pb2.HealthCheckRequest.FromString,
+          response_serializer=health__pb2.HealthCheckResponse.SerializeToString,
+      ),
+      'Watch': grpc.unary_stream_rpc_method_handler(
+          servicer.Watch,
+          request_deserializer=health__pb2.HealthCheckRequest.FromString,
+          response_serializer=health__pb2.HealthCheckResponse.SerializeToString,
+      ),
+  }
+  generic_handler = grpc.method_handlers_generic_handler(
+      'grpc.health.v1.Health', rpc_method_handlers)
+  server.add_generic_rpc_handlers((generic_handler,))
diff --git a/proto/uml/grpc.health.v1.png b/proto/uml/grpc.health.v1.png
new file mode 100644
index 0000000000000000000000000000000000000000..8172e76574a5500a0236f6fce3ef8095279bac79
Binary files /dev/null and b/proto/uml/grpc.health.v1.png differ