Merge
diff --git a/Makefile b/Makefile
index 0184e08a..ea6aad5 100644
--- a/Makefile
+++ b/Makefile
@@ -13,17 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-GERRIT_SRC=../gerrit
-GERRIT_MODULES=codereview froofle
-
 all:
 
 clean:
 	find . -name \*.pyc -type f | xargs rm -f
-
-update-pyclient:
-	$(MAKE) -C $(GERRIT_SRC) release-pyclient
-	rm -rf $(GERRIT_MODULES)
-	(cd $(GERRIT_SRC)/release/pyclient && \
-	 find . -type f \
-	 | cpio -pd $(abspath .))
diff --git a/codereview/__init__.py b/codereview/__init__.py
deleted file mode 100644
index 5883555..0000000
--- a/codereview/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-__version__ = 'v1.0-112-gbcd4db5a'
diff --git a/codereview/need_retry_pb2.py b/codereview/need_retry_pb2.py
deleted file mode 100644
index 3fab2d4..0000000
--- a/codereview/need_retry_pb2.py
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/python2.4
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-
-from froofle.protobuf import descriptor
-from froofle.protobuf import message
-from froofle.protobuf import reflection
-from froofle.protobuf import service
-from froofle.protobuf import service_reflection
-from froofle.protobuf import descriptor_pb2
-
-
-
-_RETRYREQUESTLATERRESPONSE = descriptor.Descriptor(
-  name='RetryRequestLaterResponse',
-  full_name='codereview.RetryRequestLaterResponse',
-  filename='need_retry.proto',
-  containing_type=None,
-  fields=[
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-
-
-class RetryRequestLaterResponse(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _RETRYREQUESTLATERRESPONSE
-
diff --git a/codereview/proto_client.py b/codereview/proto_client.py
deleted file mode 100755
index b58cf6a..0000000
--- a/codereview/proto_client.py
+++ /dev/null
@@ -1,380 +0,0 @@
-# Copyright 2007, 2008 Google Inc.
-#
-# Licensed 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 base64
-import cookielib
-import getpass
-import logging
-import md5
-import os
-import random
-import socket
-import sys
-import time
-import urllib
-import urllib2
-import urlparse
-
-from froofle.protobuf.service import RpcChannel
-from froofle.protobuf.service import RpcController
-from need_retry_pb2 import RetryRequestLaterResponse;
-
-_cookie_jars = {}
-
-def _open_jar(path):
-  auth = False
-
-  if path is None:
-    c = cookielib.CookieJar()
-  else:
-    c = _cookie_jars.get(path)
-    if c is None:
-      c = cookielib.MozillaCookieJar(path)
-
-      if os.path.exists(path):
-        try:
-          c.load()
-          auth = True
-        except (cookielib.LoadError, IOError):
-          pass
-
-        if auth:
-          print >>sys.stderr, \
-                'Loaded authentication cookies from %s' \
-                % path
-      else:
-        os.close(os.open(path, os.O_CREAT, 0600))
-      os.chmod(path, 0600)
-      _cookie_jars[path] = c
-    else:
-      auth = True
-  return c, auth
-
-
-class ClientLoginError(urllib2.HTTPError):
-  """Raised to indicate an error authenticating with ClientLogin."""
-
-  def __init__(self, url, code, msg, headers, args):
-    urllib2.HTTPError.__init__(self, url, code, msg, headers, None)
-    self.args = args
-    self.reason = args["Error"]
-
-
-class Proxy(object):
-  class _ResultHolder(object):
-    def __call__(self, result):
-      self._result = result
-
-  class _RemoteController(RpcController):
-    def Reset(self):
-      pass
-  
-    def Failed(self):
-      pass
-  
-    def ErrorText(self):
-      pass
-  
-    def StartCancel(self):
-      pass
-  
-    def SetFailed(self, reason):
-      raise RuntimeError, reason
-  
-    def IsCancelled(self):
-      pass
-  
-    def NotifyOnCancel(self, callback):
-      pass
-  
-  def __init__(self, stub):
-    self._stub = stub
-
-  def __getattr__(self, key):
-    method = getattr(self._stub, key)
-
-    def call(request):
-      done = self._ResultHolder()
-      method(self._RemoteController(), request, done)
-      return done._result
-
-    return call
-
-
-class HttpRpc(RpcChannel):
-  """Simple protobuf over HTTP POST implementation."""
-
-  def __init__(self, host, auth_function,
-               host_override=None,
-               extra_headers={},
-               cookie_file=None):
-    """Creates a new HttpRpc.
-
-    Args:
-      host: The host to send requests to.
-      auth_function: A function that takes no arguments and returns an
-        (email, password) tuple when called. Will be called if authentication
-        is required.
-      host_override: The host header to send to the server (defaults to host).
-      extra_headers: A dict of extra headers to append to every request.
-      cookie_file: If not None, name of the file in ~/ to save the
-        cookie jar into.  Applications are encouraged to set this to
-        '.$appname_cookies' or some otherwise unique name.
-    """
-    self.host = host.lower()
-    self.host_override = host_override
-    self.auth_function = auth_function
-    self.authenticated = False
-    self.extra_headers = extra_headers
-    self.xsrf_token = None
-    if cookie_file is None:
-      self.cookie_file = None
-    else:
-      self.cookie_file = os.path.expanduser("~/%s" % cookie_file)
-    self.opener = self._GetOpener()
-    if self.host_override:
-      logging.info("Server: %s; Host: %s", self.host, self.host_override)
-    else:
-      logging.info("Server: %s", self.host)
-
-  def CallMethod(self, method, controller, request, response_type, done):
-    pat = "application/x-google-protobuf; name=%s"
-
-    url = "/proto/%s/%s" % (method.containing_service.name, method.name)
-    reqbin = request.SerializeToString()
-    reqtyp = pat % request.DESCRIPTOR.full_name
-    reqmd5 = base64.b64encode(md5.new(reqbin).digest())
-
-    start = time.time()
-    while True:
-      t, b = self._Send(url, reqbin, reqtyp, reqmd5)
-      if t == (pat % RetryRequestLaterResponse.DESCRIPTOR.full_name):
-        if time.time() >= (start + 1800):
-          controller.SetFailed("timeout")
-          return
-        s = random.uniform(0.250, 2.000)
-        print "Busy, retrying in %.3f seconds ..." % s
-        time.sleep(s)
-        continue
-
-      if t == (pat % response_type.DESCRIPTOR.full_name):
-        response = response_type()
-        response.ParseFromString(b)
-        done(response)
-      else:
-        controller.SetFailed("Unexpected %s response" % t)
-      break
-
-  def _CreateRequest(self, url, data=None):
-    """Creates a new urllib request."""
-    logging.debug("Creating request for: '%s' with payload:\n%s", url, data)
-    req = urllib2.Request(url, data=data)
-    if self.host_override:
-      req.add_header("Host", self.host_override)
-    for key, value in self.extra_headers.iteritems():
-      req.add_header(key, value)
-    return req
-
-  def _GetAuthToken(self, email, password):
-    """Uses ClientLogin to authenticate the user, returning an auth token.
-
-    Args:
-      email:    The user's email address
-      password: The user's password
-
-    Raises:
-      ClientLoginError: If there was an error authenticating with ClientLogin.
-      HTTPError: If there was some other form of HTTP error.
-
-    Returns:
-      The authentication token returned by ClientLogin.
-    """
-    account_type = 'GOOGLE'
-    if self.host.endswith('.google.com'):
-      account_type = 'HOSTED'
-
-    req = self._CreateRequest(
-        url="https://www.google.com/accounts/ClientLogin",
-        data=urllib.urlencode({
-            "Email": email,
-            "Passwd": password,
-            "service": "ah",
-            "source": "gerrit-codereview-client",
-            "accountType": account_type,
-        })
-    )
-    try:
-      response = self.opener.open(req)
-      response_body = response.read()
-      response_dict = dict(x.split("=")
-                           for x in response_body.split("\n") if x)
-      return response_dict["Auth"]
-    except urllib2.HTTPError, e:
-      if e.code == 403:
-        body = e.read()
-        response_dict = dict(x.split("=", 1) for x in body.split("\n") if x)
-        raise ClientLoginError(req.get_full_url(), e.code, e.msg,
-                               e.headers, response_dict)
-      else:
-        raise
-
-  def _GetAuthCookie(self, auth_token):
-    """Fetches authentication cookies for an authentication token.
-
-    Args:
-      auth_token: The authentication token returned by ClientLogin.
-
-    Raises:
-      HTTPError: If there was an error fetching the authentication cookies.
-    """
-    # This is a dummy value to allow us to identify when we're successful.
-    continue_location = "http://localhost/"
-    args = {"continue": continue_location, "auth": auth_token}
-    req = self._CreateRequest("http://%s/_ah/login?%s" %
-                              (self.host, urllib.urlencode(args)))
-    try:
-      response = self.opener.open(req)
-    except urllib2.HTTPError, e:
-      response = e
-    if (response.code != 302 or
-        response.info()["location"] != continue_location):
-      raise urllib2.HTTPError(req.get_full_url(), response.code, response.msg,
-                              response.headers, response.fp)
-
-  def _GetXsrfToken(self):
-    """Fetches /proto/_token for use in X-XSRF-Token HTTP header.
-
-    Raises:
-      HTTPError: If there was an error fetching a new token.
-    """
-    tries = 0
-    while True:
-      url = "http://%s/proto/_token" % self.host
-      req = self._CreateRequest(url)
-      try:
-        response = self.opener.open(req)
-        self.xsrf_token = response.read()
-        return
-      except urllib2.HTTPError, e:
-        if tries > 3:
-          raise
-        elif e.code == 401:
-          self._Authenticate()
-        else:
-          raise
-
-  def _Authenticate(self):
-    """Authenticates the user.
-
-    The authentication process works as follows:
-     1) We get a username and password from the user
-     2) We use ClientLogin to obtain an AUTH token for the user
-        (see http://code.google.com/apis/accounts/AuthForInstalledApps.html).
-     3) We pass the auth token to /_ah/login on the server to obtain an
-        authentication cookie. If login was successful, it tries to redirect
-        us to the URL we provided.
-
-    If we attempt to access the upload API without first obtaining an
-    authentication cookie, it returns a 401 response and directs us to
-    authenticate ourselves with ClientLogin.
-    """
-    attempts = 0
-    while True:
-      attempts += 1
-      try:
-        cred = self.auth_function()
-        auth_token = self._GetAuthToken(cred[0], cred[1])
-      except ClientLoginError:
-        if attempts < 3:
-          continue
-        raise
-      self._GetAuthCookie(auth_token)
-      self.authenticated = True
-      if self.cookie_file is not None:
-        print >>sys.stderr, \
-              'Saving authentication cookies to %s' \
-              % self.cookie_file
-        self.cookie_jar.save()
-      return
-
-  def _Send(self, request_path, payload, content_type, content_md5):
-    """Sends an RPC and returns the response.
-
-    Args:
-      request_path: The path to send the request to, eg /api/appversion/create.
-      payload: The body of the request, or None to send an empty request.
-      content_type: The Content-Type header to use.
-      content_md5: The Content-MD5 header to use.
-
-    Returns:
-      The content type, as a string.
-      The response body, as a string.
-    """
-    if not self.authenticated:
-      self._Authenticate()
-    if not self.xsrf_token:
-      self._GetXsrfToken()
-
-    old_timeout = socket.getdefaulttimeout()
-    socket.setdefaulttimeout(None)
-    try:
-      tries = 0
-      while True:
-        tries += 1
-        url = "http://%s%s" % (self.host, request_path)
-        req = self._CreateRequest(url=url, data=payload)
-        req.add_header("Content-Type", content_type)
-        req.add_header("Content-MD5", content_md5)
-        req.add_header("X-XSRF-Token", self.xsrf_token)
-        try:
-          f = self.opener.open(req)
-          hdr = f.info()
-          type = hdr.getheader('Content-Type',
-                               'application/octet-stream')
-          response = f.read()
-          f.close()
-          return type, response
-        except urllib2.HTTPError, e:
-          if tries > 3:
-            raise
-          elif e.code == 401:
-            self._Authenticate()
-          elif e.code == 403:
-            if not hasattr(e, 'read'):
-              e.read = lambda self: ''
-            raise RuntimeError, '403\nxsrf: %s\n%s' \
-                  % (self.xsrf_token, e.read())
-          else:
-            raise
-    finally:
-      socket.setdefaulttimeout(old_timeout)
-
-  def _GetOpener(self):
-    """Returns an OpenerDirector that supports cookies and ignores redirects.
-
-    Returns:
-      A urllib2.OpenerDirector object.
-    """
-    opener = urllib2.OpenerDirector()
-    opener.add_handler(urllib2.ProxyHandler())
-    opener.add_handler(urllib2.UnknownHandler())
-    opener.add_handler(urllib2.HTTPHandler())
-    opener.add_handler(urllib2.HTTPDefaultErrorHandler())
-    opener.add_handler(urllib2.HTTPSHandler())
-    opener.add_handler(urllib2.HTTPErrorProcessor())
-
-    self.cookie_jar, \
-    self.authenticated = _open_jar(self.cookie_file)
-    opener.add_handler(urllib2.HTTPCookieProcessor(self.cookie_jar))
-    return opener
diff --git a/codereview/review_pb2.py b/codereview/review_pb2.py
deleted file mode 100644
index 0896feb..0000000
--- a/codereview/review_pb2.py
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/python2.4
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-
-from froofle.protobuf import descriptor
-from froofle.protobuf import message
-from froofle.protobuf import reflection
-from froofle.protobuf import service
-from froofle.protobuf import service_reflection
-from froofle.protobuf import descriptor_pb2
-
-
-import upload_bundle_pb2
-
-
-
-_REVIEWSERVICE = descriptor.ServiceDescriptor(
-  name='ReviewService',
-  full_name='codereview.ReviewService',
-  index=0,
-  options=None,
-  methods=[
-  descriptor.MethodDescriptor(
-    name='UploadBundle',
-    full_name='codereview.ReviewService.UploadBundle',
-    index=0,
-    containing_service=None,
-    input_type=upload_bundle_pb2._UPLOADBUNDLEREQUEST,
-    output_type=upload_bundle_pb2._UPLOADBUNDLERESPONSE,
-    options=None,
-  ),
-  descriptor.MethodDescriptor(
-    name='ContinueBundle',
-    full_name='codereview.ReviewService.ContinueBundle',
-    index=1,
-    containing_service=None,
-    input_type=upload_bundle_pb2._UPLOADBUNDLECONTINUE,
-    output_type=upload_bundle_pb2._UPLOADBUNDLERESPONSE,
-    options=None,
-  ),
-])
-
-class ReviewService(service.Service):
-  __metaclass__ = service_reflection.GeneratedServiceType
-  DESCRIPTOR = _REVIEWSERVICE
-class ReviewService_Stub(ReviewService):
-  __metaclass__ = service_reflection.GeneratedServiceStubType
-  DESCRIPTOR = _REVIEWSERVICE
-
diff --git a/codereview/upload_bundle_pb2.py b/codereview/upload_bundle_pb2.py
deleted file mode 100644
index ff91ee1..0000000
--- a/codereview/upload_bundle_pb2.py
+++ /dev/null
@@ -1,271 +0,0 @@
-#!/usr/bin/python2.4
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-
-from froofle.protobuf import descriptor
-from froofle.protobuf import message
-from froofle.protobuf import reflection
-from froofle.protobuf import service
-from froofle.protobuf import service_reflection
-from froofle.protobuf import descriptor_pb2
-
-
-_UPLOADBUNDLERESPONSE_CODETYPE = descriptor.EnumDescriptor(
-  name='CodeType',
-  full_name='codereview.UploadBundleResponse.CodeType',
-  filename='CodeType',
-  values=[
-    descriptor.EnumValueDescriptor(
-      name='RECEIVED', index=0, number=1,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='CONTINUE', index=1, number=4,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='UNAUTHORIZED_USER', index=2, number=7,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='UNKNOWN_CHANGE', index=3, number=9,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='CHANGE_CLOSED', index=4, number=10,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='UNKNOWN_EMAIL', index=5, number=11,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='UNKNOWN_PROJECT', index=6, number=2,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='UNKNOWN_BRANCH', index=7, number=3,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='UNKNOWN_BUNDLE', index=8, number=5,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='NOT_BUNDLE_OWNER', index=9, number=6,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='BUNDLE_CLOSED', index=10, number=8,
-      options=None,
-      type=None),
-  ],
-  options=None,
-)
-
-
-_REPLACEPATCHSET = descriptor.Descriptor(
-  name='ReplacePatchSet',
-  full_name='codereview.ReplacePatchSet',
-  filename='upload_bundle.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='change_id', full_name='codereview.ReplacePatchSet.change_id', index=0,
-      number=1, type=9, cpp_type=9, label=2,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='object_id', full_name='codereview.ReplacePatchSet.object_id', index=1,
-      number=2, type=9, cpp_type=9, label=2,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-
-_UPLOADBUNDLEREQUEST = descriptor.Descriptor(
-  name='UploadBundleRequest',
-  full_name='codereview.UploadBundleRequest',
-  filename='upload_bundle.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='dest_project', full_name='codereview.UploadBundleRequest.dest_project', index=0,
-      number=10, type=9, cpp_type=9, label=2,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='dest_branch', full_name='codereview.UploadBundleRequest.dest_branch', index=1,
-      number=11, type=9, cpp_type=9, label=2,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='partial_upload', full_name='codereview.UploadBundleRequest.partial_upload', index=2,
-      number=12, type=8, cpp_type=7, label=2,
-      default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='bundle_data', full_name='codereview.UploadBundleRequest.bundle_data', index=3,
-      number=13, type=12, cpp_type=9, label=2,
-      default_value="",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='contained_object', full_name='codereview.UploadBundleRequest.contained_object', index=4,
-      number=1, type=9, cpp_type=9, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='replace', full_name='codereview.UploadBundleRequest.replace', index=5,
-      number=2, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='reviewers', full_name='codereview.UploadBundleRequest.reviewers', index=6,
-      number=3, type=9, cpp_type=9, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='cc', full_name='codereview.UploadBundleRequest.cc', index=7,
-      number=4, type=9, cpp_type=9, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-
-_UPLOADBUNDLERESPONSE = descriptor.Descriptor(
-  name='UploadBundleResponse',
-  full_name='codereview.UploadBundleResponse',
-  filename='upload_bundle.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='status_code', full_name='codereview.UploadBundleResponse.status_code', index=0,
-      number=10, type=14, cpp_type=8, label=2,
-      default_value=1,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='bundle_id', full_name='codereview.UploadBundleResponse.bundle_id', index=1,
-      number=11, type=9, cpp_type=9, label=1,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='invalid_reviewers', full_name='codereview.UploadBundleResponse.invalid_reviewers', index=2,
-      number=12, type=9, cpp_type=9, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='invalid_cc', full_name='codereview.UploadBundleResponse.invalid_cc', index=3,
-      number=13, type=9, cpp_type=9, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-    _UPLOADBUNDLERESPONSE_CODETYPE,
-  ],
-  options=None)
-
-
-_UPLOADBUNDLECONTINUE = descriptor.Descriptor(
-  name='UploadBundleContinue',
-  full_name='codereview.UploadBundleContinue',
-  filename='upload_bundle.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='bundle_id', full_name='codereview.UploadBundleContinue.bundle_id', index=0,
-      number=10, type=9, cpp_type=9, label=2,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='segment_id', full_name='codereview.UploadBundleContinue.segment_id', index=1,
-      number=11, type=5, cpp_type=1, label=2,
-      default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='partial_upload', full_name='codereview.UploadBundleContinue.partial_upload', index=2,
-      number=12, type=8, cpp_type=7, label=2,
-      default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='bundle_data', full_name='codereview.UploadBundleContinue.bundle_data', index=3,
-      number=13, type=12, cpp_type=9, label=1,
-      default_value="",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-
-_UPLOADBUNDLEREQUEST.fields_by_name['replace'].message_type = _REPLACEPATCHSET
-_UPLOADBUNDLERESPONSE.fields_by_name['status_code'].enum_type = _UPLOADBUNDLERESPONSE_CODETYPE
-
-class ReplacePatchSet(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _REPLACEPATCHSET
-
-class UploadBundleRequest(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _UPLOADBUNDLEREQUEST
-
-class UploadBundleResponse(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _UPLOADBUNDLERESPONSE
-
-class UploadBundleContinue(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _UPLOADBUNDLECONTINUE
-
diff --git a/froofle/__init__.py b/froofle/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/froofle/__init__.py
+++ /dev/null
diff --git a/froofle/protobuf/__init__.py b/froofle/protobuf/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/froofle/protobuf/__init__.py
+++ /dev/null
diff --git a/froofle/protobuf/descriptor.py b/froofle/protobuf/descriptor.py
deleted file mode 100644
index e74cf25..0000000
--- a/froofle/protobuf/descriptor.py
+++ /dev/null
@@ -1,433 +0,0 @@
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# TODO(robinson): We probably need to provide deep-copy methods for
-# descriptor types.  When a FieldDescriptor is passed into
-# Descriptor.__init__(), we should make a deep copy and then set
-# containing_type on it.  Alternatively, we could just get
-# rid of containing_type (iit's not needed for reflection.py, at least).
-#
-# TODO(robinson): Print method?
-#
-# TODO(robinson): Useful __repr__?
-
-"""Descriptors essentially contain exactly the information found in a .proto
-file, in types that make this information accessible in Python.
-"""
-
-__author__ = 'robinson@google.com (Will Robinson)'
-
-class DescriptorBase(object):
-
-  """Descriptors base class.
-
-  This class is the base of all descriptor classes. It provides common options
-  related functionaility.
-  """
-
-  def __init__(self, options, options_class_name):
-    """Initialize the descriptor given its options message and the name of the
-    class of the options message. The name of the class is required in case
-    the options message is None and has to be created.
-    """
-    self._options = options
-    self._options_class_name = options_class_name
-
-  def GetOptions(self):
-    """Retrieves descriptor options.
-
-    This method returns the options set or creates the default options for the
-    descriptor.
-    """
-    if self._options:
-      return self._options
-    from froofle.protobuf import descriptor_pb2
-    try:
-      options_class = getattr(descriptor_pb2, self._options_class_name)
-    except AttributeError:
-      raise RuntimeError('Unknown options class name %s!' %
-                         (self._options_class_name))
-    self._options = options_class()
-    return self._options
-
-
-class Descriptor(DescriptorBase):
-
-  """Descriptor for a protocol message type.
-
-  A Descriptor instance has the following attributes:
-
-    name: (str) Name of this protocol message type.
-    full_name: (str) Fully-qualified name of this protocol message type,
-      which will include protocol "package" name and the name of any
-      enclosing types.
-
-    filename: (str) Name of the .proto file containing this message.
-
-    containing_type: (Descriptor) Reference to the descriptor of the
-      type containing us, or None if we have no containing type.
-
-    fields: (list of FieldDescriptors) Field descriptors for all
-      fields in this type.
-    fields_by_number: (dict int -> FieldDescriptor) Same FieldDescriptor
-      objects as in |fields|, but indexed by "number" attribute in each
-      FieldDescriptor.
-    fields_by_name: (dict str -> FieldDescriptor) Same FieldDescriptor
-      objects as in |fields|, but indexed by "name" attribute in each
-      FieldDescriptor.
-
-    nested_types: (list of Descriptors) Descriptor references
-      for all protocol message types nested within this one.
-    nested_types_by_name: (dict str -> Descriptor) Same Descriptor
-      objects as in |nested_types|, but indexed by "name" attribute
-      in each Descriptor.
-
-    enum_types: (list of EnumDescriptors) EnumDescriptor references
-      for all enums contained within this type.
-    enum_types_by_name: (dict str ->EnumDescriptor) Same EnumDescriptor
-      objects as in |enum_types|, but indexed by "name" attribute
-      in each EnumDescriptor.
-    enum_values_by_name: (dict str -> EnumValueDescriptor) Dict mapping
-      from enum value name to EnumValueDescriptor for that value.
-
-    extensions: (list of FieldDescriptor) All extensions defined directly
-      within this message type (NOT within a nested type).
-    extensions_by_name: (dict, string -> FieldDescriptor) Same FieldDescriptor
-      objects as |extensions|, but indexed by "name" attribute of each
-      FieldDescriptor.
-
-    options: (descriptor_pb2.MessageOptions) Protocol message options or None
-      to use default message options.
-  """
-
-  def __init__(self, name, full_name, filename, containing_type,
-               fields, nested_types, enum_types, extensions, options=None):
-    """Arguments to __init__() are as described in the description
-    of Descriptor fields above.
-    """
-    super(Descriptor, self).__init__(options, 'MessageOptions')
-    self.name = name
-    self.full_name = full_name
-    self.filename = filename
-    self.containing_type = containing_type
-
-    # We have fields in addition to fields_by_name and fields_by_number,
-    # so that:
-    #   1. Clients can index fields by "order in which they're listed."
-    #   2. Clients can easily iterate over all fields with the terse
-    #      syntax: for f in descriptor.fields: ...
-    self.fields = fields
-    for field in self.fields:
-      field.containing_type = self
-    self.fields_by_number = dict((f.number, f) for f in fields)
-    self.fields_by_name = dict((f.name, f) for f in fields)
-
-    self.nested_types = nested_types
-    self.nested_types_by_name = dict((t.name, t) for t in nested_types)
-
-    self.enum_types = enum_types
-    for enum_type in self.enum_types:
-      enum_type.containing_type = self
-    self.enum_types_by_name = dict((t.name, t) for t in enum_types)
-    self.enum_values_by_name = dict(
-        (v.name, v) for t in enum_types for v in t.values)
-
-    self.extensions = extensions
-    for extension in self.extensions:
-      extension.extension_scope = self
-    self.extensions_by_name = dict((f.name, f) for f in extensions)
-
-
-# TODO(robinson): We should have aggressive checking here,
-# for example:
-#   * If you specify a repeated field, you should not be allowed
-#     to specify a default value.
-#   * [Other examples here as needed].
-#
-# TODO(robinson): for this and other *Descriptor classes, we
-# might also want to lock things down aggressively (e.g.,
-# prevent clients from setting the attributes).  Having
-# stronger invariants here in general will reduce the number
-# of runtime checks we must do in reflection.py...
-class FieldDescriptor(DescriptorBase):
-
-  """Descriptor for a single field in a .proto file.
-
-  A FieldDescriptor instance has the following attriubtes:
-
-    name: (str) Name of this field, exactly as it appears in .proto.
-    full_name: (str) Name of this field, including containing scope.  This is
-      particularly relevant for extensions.
-    index: (int) Dense, 0-indexed index giving the order that this
-      field textually appears within its message in the .proto file.
-    number: (int) Tag number declared for this field in the .proto file.
-
-    type: (One of the TYPE_* constants below) Declared type.
-    cpp_type: (One of the CPPTYPE_* constants below) C++ type used to
-      represent this field.
-
-    label: (One of the LABEL_* constants below) Tells whether this
-      field is optional, required, or repeated.
-    default_value: (Varies) Default value of this field.  Only
-      meaningful for non-repeated scalar fields.  Repeated fields
-      should always set this to [], and non-repeated composite
-      fields should always set this to None.
-
-    containing_type: (Descriptor) Descriptor of the protocol message
-      type that contains this field.  Set by the Descriptor constructor
-      if we're passed into one.
-      Somewhat confusingly, for extension fields, this is the
-      descriptor of the EXTENDED message, not the descriptor
-      of the message containing this field.  (See is_extension and
-      extension_scope below).
-    message_type: (Descriptor) If a composite field, a descriptor
-      of the message type contained in this field.  Otherwise, this is None.
-    enum_type: (EnumDescriptor) If this field contains an enum, a
-      descriptor of that enum.  Otherwise, this is None.
-
-    is_extension: True iff this describes an extension field.
-    extension_scope: (Descriptor) Only meaningful if is_extension is True.
-      Gives the message that immediately contains this extension field.
-      Will be None iff we're a top-level (file-level) extension field.
-
-    options: (descriptor_pb2.FieldOptions) Protocol message field options or
-      None to use default field options.
-  """
-
-  # Must be consistent with C++ FieldDescriptor::Type enum in
-  # descriptor.h.
-  #
-  # TODO(robinson): Find a way to eliminate this repetition.
-  TYPE_DOUBLE         = 1
-  TYPE_FLOAT          = 2
-  TYPE_INT64          = 3
-  TYPE_UINT64         = 4
-  TYPE_INT32          = 5
-  TYPE_FIXED64        = 6
-  TYPE_FIXED32        = 7
-  TYPE_BOOL           = 8
-  TYPE_STRING         = 9
-  TYPE_GROUP          = 10
-  TYPE_MESSAGE        = 11
-  TYPE_BYTES          = 12
-  TYPE_UINT32         = 13
-  TYPE_ENUM           = 14
-  TYPE_SFIXED32       = 15
-  TYPE_SFIXED64       = 16
-  TYPE_SINT32         = 17
-  TYPE_SINT64         = 18
-  MAX_TYPE            = 18
-
-  # Must be consistent with C++ FieldDescriptor::CppType enum in
-  # descriptor.h.
-  #
-  # TODO(robinson): Find a way to eliminate this repetition.
-  CPPTYPE_INT32       = 1
-  CPPTYPE_INT64       = 2
-  CPPTYPE_UINT32      = 3
-  CPPTYPE_UINT64      = 4
-  CPPTYPE_DOUBLE      = 5
-  CPPTYPE_FLOAT       = 6
-  CPPTYPE_BOOL        = 7
-  CPPTYPE_ENUM        = 8
-  CPPTYPE_STRING      = 9
-  CPPTYPE_MESSAGE     = 10
-  MAX_CPPTYPE         = 10
-
-  # Must be consistent with C++ FieldDescriptor::Label enum in
-  # descriptor.h.
-  #
-  # TODO(robinson): Find a way to eliminate this repetition.
-  LABEL_OPTIONAL      = 1
-  LABEL_REQUIRED      = 2
-  LABEL_REPEATED      = 3
-  MAX_LABEL           = 3
-
-  def __init__(self, name, full_name, index, number, type, cpp_type, label,
-               default_value, message_type, enum_type, containing_type,
-               is_extension, extension_scope, options=None):
-    """The arguments are as described in the description of FieldDescriptor
-    attributes above.
-
-    Note that containing_type may be None, and may be set later if necessary
-    (to deal with circular references between message types, for example).
-    Likewise for extension_scope.
-    """
-    super(FieldDescriptor, self).__init__(options, 'FieldOptions')
-    self.name = name
-    self.full_name = full_name
-    self.index = index
-    self.number = number
-    self.type = type
-    self.cpp_type = cpp_type
-    self.label = label
-    self.default_value = default_value
-    self.containing_type = containing_type
-    self.message_type = message_type
-    self.enum_type = enum_type
-    self.is_extension = is_extension
-    self.extension_scope = extension_scope
-
-
-class EnumDescriptor(DescriptorBase):
-
-  """Descriptor for an enum defined in a .proto file.
-
-  An EnumDescriptor instance has the following attributes:
-
-    name: (str) Name of the enum type.
-    full_name: (str) Full name of the type, including package name
-      and any enclosing type(s).
-    filename: (str) Name of the .proto file in which this appears.
-
-    values: (list of EnumValueDescriptors) List of the values
-      in this enum.
-    values_by_name: (dict str -> EnumValueDescriptor) Same as |values|,
-      but indexed by the "name" field of each EnumValueDescriptor.
-    values_by_number: (dict int -> EnumValueDescriptor) Same as |values|,
-      but indexed by the "number" field of each EnumValueDescriptor.
-    containing_type: (Descriptor) Descriptor of the immediate containing
-      type of this enum, or None if this is an enum defined at the
-      top level in a .proto file.  Set by Descriptor's constructor
-      if we're passed into one.
-    options: (descriptor_pb2.EnumOptions) Enum options message or
-      None to use default enum options.
-  """
-
-  def __init__(self, name, full_name, filename, values,
-               containing_type=None, options=None):
-    """Arguments are as described in the attribute description above."""
-    super(EnumDescriptor, self).__init__(options, 'EnumOptions')
-    self.name = name
-    self.full_name = full_name
-    self.filename = filename
-    self.values = values
-    for value in self.values:
-      value.type = self
-    self.values_by_name = dict((v.name, v) for v in values)
-    self.values_by_number = dict((v.number, v) for v in values)
-    self.containing_type = containing_type
-
-
-class EnumValueDescriptor(DescriptorBase):
-
-  """Descriptor for a single value within an enum.
-
-    name: (str) Name of this value.
-    index: (int) Dense, 0-indexed index giving the order that this
-      value appears textually within its enum in the .proto file.
-    number: (int) Actual number assigned to this enum value.
-    type: (EnumDescriptor) EnumDescriptor to which this value
-      belongs.  Set by EnumDescriptor's constructor if we're
-      passed into one.
-    options: (descriptor_pb2.EnumValueOptions) Enum value options message or
-      None to use default enum value options options.
-  """
-
-  def __init__(self, name, index, number, type=None, options=None):
-    """Arguments are as described in the attribute description above."""
-    super(EnumValueDescriptor, self).__init__(options, 'EnumValueOptions')
-    self.name = name
-    self.index = index
-    self.number = number
-    self.type = type
-
-
-class ServiceDescriptor(DescriptorBase):
-
-  """Descriptor for a service.
-
-    name: (str) Name of the service.
-    full_name: (str) Full name of the service, including package name.
-    index: (int) 0-indexed index giving the order that this services
-      definition appears withing the .proto file.
-    methods: (list of MethodDescriptor) List of methods provided by this
-      service.
-    options: (descriptor_pb2.ServiceOptions) Service options message or
-      None to use default service options.
-  """
-
-  def __init__(self, name, full_name, index, methods, options=None):
-    super(ServiceDescriptor, self).__init__(options, 'ServiceOptions')
-    self.name = name
-    self.full_name = full_name
-    self.index = index
-    self.methods = methods
-    # Set the containing service for each method in this service.
-    for method in self.methods:
-      method.containing_service = self
-
-  def FindMethodByName(self, name):
-    """Searches for the specified method, and returns its descriptor."""
-    for method in self.methods:
-      if name == method.name:
-        return method
-    return None
-
-
-class MethodDescriptor(DescriptorBase):
-
-  """Descriptor for a method in a service.
-
-  name: (str) Name of the method within the service.
-  full_name: (str) Full name of method.
-  index: (int) 0-indexed index of the method inside the service.
-  containing_service: (ServiceDescriptor) The service that contains this
-    method.
-  input_type: The descriptor of the message that this method accepts.
-  output_type: The descriptor of the message that this method returns.
-  options: (descriptor_pb2.MethodOptions) Method options message or
-    None to use default method options.
-  """
-
-  def __init__(self, name, full_name, index, containing_service,
-               input_type, output_type, options=None):
-    """The arguments are as described in the description of MethodDescriptor
-    attributes above.
-
-    Note that containing_service may be None, and may be set later if necessary.
-    """
-    super(MethodDescriptor, self).__init__(options, 'MethodOptions')
-    self.name = name
-    self.full_name = full_name
-    self.index = index
-    self.containing_service = containing_service
-    self.input_type = input_type
-    self.output_type = output_type
-
-
-def _ParseOptions(message, string):
-  """Parses serialized options.
-
-  This helper function is used to parse serialized options in generated
-  proto2 files. It must not be used outside proto2.
-  """
-  message.ParseFromString(string)
-  return message;
diff --git a/froofle/protobuf/descriptor_pb2.py b/froofle/protobuf/descriptor_pb2.py
deleted file mode 100644
index 1687383..0000000
--- a/froofle/protobuf/descriptor_pb2.py
+++ /dev/null
@@ -1,950 +0,0 @@
-#!/usr/bin/python2.4
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-
-from froofle.protobuf import descriptor
-from froofle.protobuf import message
-from froofle.protobuf import reflection
-from froofle.protobuf import service
-from froofle.protobuf import service_reflection
-
-
-_FIELDDESCRIPTORPROTO_TYPE = descriptor.EnumDescriptor(
-  name='Type',
-  full_name='froofle.protobuf.FieldDescriptorProto.Type',
-  filename='Type',
-  values=[
-    descriptor.EnumValueDescriptor(
-      name='TYPE_DOUBLE', index=0, number=1,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='TYPE_FLOAT', index=1, number=2,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='TYPE_INT64', index=2, number=3,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='TYPE_UINT64', index=3, number=4,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='TYPE_INT32', index=4, number=5,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='TYPE_FIXED64', index=5, number=6,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='TYPE_FIXED32', index=6, number=7,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='TYPE_BOOL', index=7, number=8,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='TYPE_STRING', index=8, number=9,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='TYPE_GROUP', index=9, number=10,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='TYPE_MESSAGE', index=10, number=11,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='TYPE_BYTES', index=11, number=12,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='TYPE_UINT32', index=12, number=13,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='TYPE_ENUM', index=13, number=14,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='TYPE_SFIXED32', index=14, number=15,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='TYPE_SFIXED64', index=15, number=16,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='TYPE_SINT32', index=16, number=17,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='TYPE_SINT64', index=17, number=18,
-      options=None,
-      type=None),
-  ],
-  options=None,
-)
-
-_FIELDDESCRIPTORPROTO_LABEL = descriptor.EnumDescriptor(
-  name='Label',
-  full_name='froofle.protobuf.FieldDescriptorProto.Label',
-  filename='Label',
-  values=[
-    descriptor.EnumValueDescriptor(
-      name='LABEL_OPTIONAL', index=0, number=1,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='LABEL_REQUIRED', index=1, number=2,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='LABEL_REPEATED', index=2, number=3,
-      options=None,
-      type=None),
-  ],
-  options=None,
-)
-
-_FILEOPTIONS_OPTIMIZEMODE = descriptor.EnumDescriptor(
-  name='OptimizeMode',
-  full_name='froofle.protobuf.FileOptions.OptimizeMode',
-  filename='OptimizeMode',
-  values=[
-    descriptor.EnumValueDescriptor(
-      name='SPEED', index=0, number=1,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='CODE_SIZE', index=1, number=2,
-      options=None,
-      type=None),
-  ],
-  options=None,
-)
-
-_FIELDOPTIONS_CTYPE = descriptor.EnumDescriptor(
-  name='CType',
-  full_name='froofle.protobuf.FieldOptions.CType',
-  filename='CType',
-  values=[
-    descriptor.EnumValueDescriptor(
-      name='CORD', index=0, number=1,
-      options=None,
-      type=None),
-    descriptor.EnumValueDescriptor(
-      name='STRING_PIECE', index=1, number=2,
-      options=None,
-      type=None),
-  ],
-  options=None,
-)
-
-
-_FILEDESCRIPTORSET = descriptor.Descriptor(
-  name='FileDescriptorSet',
-  full_name='froofle.protobuf.FileDescriptorSet',
-  filename='froofle/protobuf/descriptor.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='file', full_name='froofle.protobuf.FileDescriptorSet.file', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-
-_FILEDESCRIPTORPROTO = descriptor.Descriptor(
-  name='FileDescriptorProto',
-  full_name='froofle.protobuf.FileDescriptorProto',
-  filename='froofle/protobuf/descriptor.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='name', full_name='froofle.protobuf.FileDescriptorProto.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='package', full_name='froofle.protobuf.FileDescriptorProto.package', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='dependency', full_name='froofle.protobuf.FileDescriptorProto.dependency', index=2,
-      number=3, type=9, cpp_type=9, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='message_type', full_name='froofle.protobuf.FileDescriptorProto.message_type', index=3,
-      number=4, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='enum_type', full_name='froofle.protobuf.FileDescriptorProto.enum_type', index=4,
-      number=5, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='service', full_name='froofle.protobuf.FileDescriptorProto.service', index=5,
-      number=6, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='extension', full_name='froofle.protobuf.FileDescriptorProto.extension', index=6,
-      number=7, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='options', full_name='froofle.protobuf.FileDescriptorProto.options', index=7,
-      number=8, type=11, cpp_type=10, label=1,
-      default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-
-_DESCRIPTORPROTO_EXTENSIONRANGE = descriptor.Descriptor(
-  name='ExtensionRange',
-  full_name='froofle.protobuf.DescriptorProto.ExtensionRange',
-  filename='froofle/protobuf/descriptor.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='start', full_name='froofle.protobuf.DescriptorProto.ExtensionRange.start', index=0,
-      number=1, type=5, cpp_type=1, label=1,
-      default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='end', full_name='froofle.protobuf.DescriptorProto.ExtensionRange.end', index=1,
-      number=2, type=5, cpp_type=1, label=1,
-      default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-_DESCRIPTORPROTO = descriptor.Descriptor(
-  name='DescriptorProto',
-  full_name='froofle.protobuf.DescriptorProto',
-  filename='froofle/protobuf/descriptor.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='name', full_name='froofle.protobuf.DescriptorProto.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='field', full_name='froofle.protobuf.DescriptorProto.field', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='extension', full_name='froofle.protobuf.DescriptorProto.extension', index=2,
-      number=6, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='nested_type', full_name='froofle.protobuf.DescriptorProto.nested_type', index=3,
-      number=3, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='enum_type', full_name='froofle.protobuf.DescriptorProto.enum_type', index=4,
-      number=4, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='extension_range', full_name='froofle.protobuf.DescriptorProto.extension_range', index=5,
-      number=5, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='options', full_name='froofle.protobuf.DescriptorProto.options', index=6,
-      number=7, type=11, cpp_type=10, label=1,
-      default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-
-_FIELDDESCRIPTORPROTO = descriptor.Descriptor(
-  name='FieldDescriptorProto',
-  full_name='froofle.protobuf.FieldDescriptorProto',
-  filename='froofle/protobuf/descriptor.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='name', full_name='froofle.protobuf.FieldDescriptorProto.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='number', full_name='froofle.protobuf.FieldDescriptorProto.number', index=1,
-      number=3, type=5, cpp_type=1, label=1,
-      default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='label', full_name='froofle.protobuf.FieldDescriptorProto.label', index=2,
-      number=4, type=14, cpp_type=8, label=1,
-      default_value=1,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='type', full_name='froofle.protobuf.FieldDescriptorProto.type', index=3,
-      number=5, type=14, cpp_type=8, label=1,
-      default_value=1,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='type_name', full_name='froofle.protobuf.FieldDescriptorProto.type_name', index=4,
-      number=6, type=9, cpp_type=9, label=1,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='extendee', full_name='froofle.protobuf.FieldDescriptorProto.extendee', index=5,
-      number=2, type=9, cpp_type=9, label=1,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='default_value', full_name='froofle.protobuf.FieldDescriptorProto.default_value', index=6,
-      number=7, type=9, cpp_type=9, label=1,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='options', full_name='froofle.protobuf.FieldDescriptorProto.options', index=7,
-      number=8, type=11, cpp_type=10, label=1,
-      default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-    _FIELDDESCRIPTORPROTO_TYPE,
-    _FIELDDESCRIPTORPROTO_LABEL,
-  ],
-  options=None)
-
-
-_ENUMDESCRIPTORPROTO = descriptor.Descriptor(
-  name='EnumDescriptorProto',
-  full_name='froofle.protobuf.EnumDescriptorProto',
-  filename='froofle/protobuf/descriptor.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='name', full_name='froofle.protobuf.EnumDescriptorProto.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='value', full_name='froofle.protobuf.EnumDescriptorProto.value', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='options', full_name='froofle.protobuf.EnumDescriptorProto.options', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-
-_ENUMVALUEDESCRIPTORPROTO = descriptor.Descriptor(
-  name='EnumValueDescriptorProto',
-  full_name='froofle.protobuf.EnumValueDescriptorProto',
-  filename='froofle/protobuf/descriptor.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='name', full_name='froofle.protobuf.EnumValueDescriptorProto.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='number', full_name='froofle.protobuf.EnumValueDescriptorProto.number', index=1,
-      number=2, type=5, cpp_type=1, label=1,
-      default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='options', full_name='froofle.protobuf.EnumValueDescriptorProto.options', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-
-_SERVICEDESCRIPTORPROTO = descriptor.Descriptor(
-  name='ServiceDescriptorProto',
-  full_name='froofle.protobuf.ServiceDescriptorProto',
-  filename='froofle/protobuf/descriptor.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='name', full_name='froofle.protobuf.ServiceDescriptorProto.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='method', full_name='froofle.protobuf.ServiceDescriptorProto.method', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='options', full_name='froofle.protobuf.ServiceDescriptorProto.options', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-
-_METHODDESCRIPTORPROTO = descriptor.Descriptor(
-  name='MethodDescriptorProto',
-  full_name='froofle.protobuf.MethodDescriptorProto',
-  filename='froofle/protobuf/descriptor.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='name', full_name='froofle.protobuf.MethodDescriptorProto.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='input_type', full_name='froofle.protobuf.MethodDescriptorProto.input_type', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='output_type', full_name='froofle.protobuf.MethodDescriptorProto.output_type', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='options', full_name='froofle.protobuf.MethodDescriptorProto.options', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-
-_FILEOPTIONS = descriptor.Descriptor(
-  name='FileOptions',
-  full_name='froofle.protobuf.FileOptions',
-  filename='froofle/protobuf/descriptor.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='java_package', full_name='froofle.protobuf.FileOptions.java_package', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='java_outer_classname', full_name='froofle.protobuf.FileOptions.java_outer_classname', index=1,
-      number=8, type=9, cpp_type=9, label=1,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='java_multiple_files', full_name='froofle.protobuf.FileOptions.java_multiple_files', index=2,
-      number=10, type=8, cpp_type=7, label=1,
-      default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='optimize_for', full_name='froofle.protobuf.FileOptions.optimize_for', index=3,
-      number=9, type=14, cpp_type=8, label=1,
-      default_value=2,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='uninterpreted_option', full_name='froofle.protobuf.FileOptions.uninterpreted_option', index=4,
-      number=999, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-    _FILEOPTIONS_OPTIMIZEMODE,
-  ],
-  options=None)
-
-
-_MESSAGEOPTIONS = descriptor.Descriptor(
-  name='MessageOptions',
-  full_name='froofle.protobuf.MessageOptions',
-  filename='froofle/protobuf/descriptor.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='message_set_wire_format', full_name='froofle.protobuf.MessageOptions.message_set_wire_format', index=0,
-      number=1, type=8, cpp_type=7, label=1,
-      default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='uninterpreted_option', full_name='froofle.protobuf.MessageOptions.uninterpreted_option', index=1,
-      number=999, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-
-_FIELDOPTIONS = descriptor.Descriptor(
-  name='FieldOptions',
-  full_name='froofle.protobuf.FieldOptions',
-  filename='froofle/protobuf/descriptor.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='ctype', full_name='froofle.protobuf.FieldOptions.ctype', index=0,
-      number=1, type=14, cpp_type=8, label=1,
-      default_value=1,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='experimental_map_key', full_name='froofle.protobuf.FieldOptions.experimental_map_key', index=1,
-      number=9, type=9, cpp_type=9, label=1,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='uninterpreted_option', full_name='froofle.protobuf.FieldOptions.uninterpreted_option', index=2,
-      number=999, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-    _FIELDOPTIONS_CTYPE,
-  ],
-  options=None)
-
-
-_ENUMOPTIONS = descriptor.Descriptor(
-  name='EnumOptions',
-  full_name='froofle.protobuf.EnumOptions',
-  filename='froofle/protobuf/descriptor.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='uninterpreted_option', full_name='froofle.protobuf.EnumOptions.uninterpreted_option', index=0,
-      number=999, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-
-_ENUMVALUEOPTIONS = descriptor.Descriptor(
-  name='EnumValueOptions',
-  full_name='froofle.protobuf.EnumValueOptions',
-  filename='froofle/protobuf/descriptor.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='uninterpreted_option', full_name='froofle.protobuf.EnumValueOptions.uninterpreted_option', index=0,
-      number=999, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-
-_SERVICEOPTIONS = descriptor.Descriptor(
-  name='ServiceOptions',
-  full_name='froofle.protobuf.ServiceOptions',
-  filename='froofle/protobuf/descriptor.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='uninterpreted_option', full_name='froofle.protobuf.ServiceOptions.uninterpreted_option', index=0,
-      number=999, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-
-_METHODOPTIONS = descriptor.Descriptor(
-  name='MethodOptions',
-  full_name='froofle.protobuf.MethodOptions',
-  filename='froofle/protobuf/descriptor.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='uninterpreted_option', full_name='froofle.protobuf.MethodOptions.uninterpreted_option', index=0,
-      number=999, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-
-_UNINTERPRETEDOPTION_NAMEPART = descriptor.Descriptor(
-  name='NamePart',
-  full_name='froofle.protobuf.UninterpretedOption.NamePart',
-  filename='froofle/protobuf/descriptor.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='name_part', full_name='froofle.protobuf.UninterpretedOption.NamePart.name_part', index=0,
-      number=1, type=9, cpp_type=9, label=2,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='is_extension', full_name='froofle.protobuf.UninterpretedOption.NamePart.is_extension', index=1,
-      number=2, type=8, cpp_type=7, label=2,
-      default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-_UNINTERPRETEDOPTION = descriptor.Descriptor(
-  name='UninterpretedOption',
-  full_name='froofle.protobuf.UninterpretedOption',
-  filename='froofle/protobuf/descriptor.proto',
-  containing_type=None,
-  fields=[
-    descriptor.FieldDescriptor(
-      name='name', full_name='froofle.protobuf.UninterpretedOption.name', index=0,
-      number=2, type=11, cpp_type=10, label=3,
-      default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='identifier_value', full_name='froofle.protobuf.UninterpretedOption.identifier_value', index=1,
-      number=3, type=9, cpp_type=9, label=1,
-      default_value=unicode("", "utf-8"),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='positive_int_value', full_name='froofle.protobuf.UninterpretedOption.positive_int_value', index=2,
-      number=4, type=4, cpp_type=4, label=1,
-      default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='negative_int_value', full_name='froofle.protobuf.UninterpretedOption.negative_int_value', index=3,
-      number=5, type=3, cpp_type=2, label=1,
-      default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='double_value', full_name='froofle.protobuf.UninterpretedOption.double_value', index=4,
-      number=6, type=1, cpp_type=5, label=1,
-      default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    descriptor.FieldDescriptor(
-      name='string_value', full_name='froofle.protobuf.UninterpretedOption.string_value', index=5,
-      number=7, type=12, cpp_type=9, label=1,
-      default_value="",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],  # TODO(robinson): Implement.
-  enum_types=[
-  ],
-  options=None)
-
-
-_FILEDESCRIPTORSET.fields_by_name['file'].message_type = _FILEDESCRIPTORPROTO
-_FILEDESCRIPTORPROTO.fields_by_name['message_type'].message_type = _DESCRIPTORPROTO
-_FILEDESCRIPTORPROTO.fields_by_name['enum_type'].message_type = _ENUMDESCRIPTORPROTO
-_FILEDESCRIPTORPROTO.fields_by_name['service'].message_type = _SERVICEDESCRIPTORPROTO
-_FILEDESCRIPTORPROTO.fields_by_name['extension'].message_type = _FIELDDESCRIPTORPROTO
-_FILEDESCRIPTORPROTO.fields_by_name['options'].message_type = _FILEOPTIONS
-_DESCRIPTORPROTO.fields_by_name['field'].message_type = _FIELDDESCRIPTORPROTO
-_DESCRIPTORPROTO.fields_by_name['extension'].message_type = _FIELDDESCRIPTORPROTO
-_DESCRIPTORPROTO.fields_by_name['nested_type'].message_type = _DESCRIPTORPROTO
-_DESCRIPTORPROTO.fields_by_name['enum_type'].message_type = _ENUMDESCRIPTORPROTO
-_DESCRIPTORPROTO.fields_by_name['extension_range'].message_type = _DESCRIPTORPROTO_EXTENSIONRANGE
-_DESCRIPTORPROTO.fields_by_name['options'].message_type = _MESSAGEOPTIONS
-_FIELDDESCRIPTORPROTO.fields_by_name['label'].enum_type = _FIELDDESCRIPTORPROTO_LABEL
-_FIELDDESCRIPTORPROTO.fields_by_name['type'].enum_type = _FIELDDESCRIPTORPROTO_TYPE
-_FIELDDESCRIPTORPROTO.fields_by_name['options'].message_type = _FIELDOPTIONS
-_ENUMDESCRIPTORPROTO.fields_by_name['value'].message_type = _ENUMVALUEDESCRIPTORPROTO
-_ENUMDESCRIPTORPROTO.fields_by_name['options'].message_type = _ENUMOPTIONS
-_ENUMVALUEDESCRIPTORPROTO.fields_by_name['options'].message_type = _ENUMVALUEOPTIONS
-_SERVICEDESCRIPTORPROTO.fields_by_name['method'].message_type = _METHODDESCRIPTORPROTO
-_SERVICEDESCRIPTORPROTO.fields_by_name['options'].message_type = _SERVICEOPTIONS
-_METHODDESCRIPTORPROTO.fields_by_name['options'].message_type = _METHODOPTIONS
-_FILEOPTIONS.fields_by_name['optimize_for'].enum_type = _FILEOPTIONS_OPTIMIZEMODE
-_FILEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION
-_MESSAGEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION
-_FIELDOPTIONS.fields_by_name['ctype'].enum_type = _FIELDOPTIONS_CTYPE
-_FIELDOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION
-_ENUMOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION
-_ENUMVALUEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION
-_SERVICEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION
-_METHODOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION
-_UNINTERPRETEDOPTION.fields_by_name['name'].message_type = _UNINTERPRETEDOPTION_NAMEPART
-
-class FileDescriptorSet(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _FILEDESCRIPTORSET
-
-class FileDescriptorProto(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _FILEDESCRIPTORPROTO
-
-class DescriptorProto(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  
-  class ExtensionRange(message.Message):
-    __metaclass__ = reflection.GeneratedProtocolMessageType
-    DESCRIPTOR = _DESCRIPTORPROTO_EXTENSIONRANGE
-  DESCRIPTOR = _DESCRIPTORPROTO
-
-class FieldDescriptorProto(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _FIELDDESCRIPTORPROTO
-
-class EnumDescriptorProto(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _ENUMDESCRIPTORPROTO
-
-class EnumValueDescriptorProto(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _ENUMVALUEDESCRIPTORPROTO
-
-class ServiceDescriptorProto(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _SERVICEDESCRIPTORPROTO
-
-class MethodDescriptorProto(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _METHODDESCRIPTORPROTO
-
-class FileOptions(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _FILEOPTIONS
-
-class MessageOptions(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _MESSAGEOPTIONS
-
-class FieldOptions(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _FIELDOPTIONS
-
-class EnumOptions(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _ENUMOPTIONS
-
-class EnumValueOptions(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _ENUMVALUEOPTIONS
-
-class ServiceOptions(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _SERVICEOPTIONS
-
-class MethodOptions(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _METHODOPTIONS
-
-class UninterpretedOption(message.Message):
-  __metaclass__ = reflection.GeneratedProtocolMessageType
-  
-  class NamePart(message.Message):
-    __metaclass__ = reflection.GeneratedProtocolMessageType
-    DESCRIPTOR = _UNINTERPRETEDOPTION_NAMEPART
-  DESCRIPTOR = _UNINTERPRETEDOPTION
-
diff --git a/froofle/protobuf/internal/__init__.py b/froofle/protobuf/internal/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/froofle/protobuf/internal/__init__.py
+++ /dev/null
diff --git a/froofle/protobuf/internal/decoder.py b/froofle/protobuf/internal/decoder.py
deleted file mode 100644
index 2dd4c96..0000000
--- a/froofle/protobuf/internal/decoder.py
+++ /dev/null
@@ -1,209 +0,0 @@
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""Class for decoding protocol buffer primitives.
-
-Contains the logic for decoding every logical protocol field type
-from one of the 5 physical wire types.
-"""
-
-__author__ = 'robinson@google.com (Will Robinson)'
-
-import struct
-from froofle.protobuf import message
-from froofle.protobuf.internal import input_stream
-from froofle.protobuf.internal import wire_format
-
-
-
-# Note that much of this code is ported from //net/proto/ProtocolBuffer, and
-# that the interface is strongly inspired by WireFormat from the C++ proto2
-# implementation.
-
-
-class Decoder(object):
-
-  """Decodes logical protocol buffer fields from the wire."""
-
-  def __init__(self, s):
-    """Initializes the decoder to read from s.
-
-    Args:
-      s: An immutable sequence of bytes, which must be accessible
-        via the Python buffer() primitive (i.e., buffer(s)).
-    """
-    self._stream = input_stream.InputStream(s)
-
-  def EndOfStream(self):
-    """Returns true iff we've reached the end of the bytes we're reading."""
-    return self._stream.EndOfStream()
-
-  def Position(self):
-    """Returns the 0-indexed position in |s|."""
-    return self._stream.Position()
-
-  def ReadFieldNumberAndWireType(self):
-    """Reads a tag from the wire. Returns a (field_number, wire_type) pair."""
-    tag_and_type = self.ReadUInt32()
-    return wire_format.UnpackTag(tag_and_type)
-
-  def SkipBytes(self, bytes):
-    """Skips the specified number of bytes on the wire."""
-    self._stream.SkipBytes(bytes)
-
-  # Note that the Read*() methods below are not exactly symmetrical with the
-  # corresponding Encoder.Append*() methods.  Those Encoder methods first
-  # encode a tag, but the Read*() methods below assume that the tag has already
-  # been read, and that the client wishes to read a field of the specified type
-  # starting at the current position.
-
-  def ReadInt32(self):
-    """Reads and returns a signed, varint-encoded, 32-bit integer."""
-    return self._stream.ReadVarint32()
-
-  def ReadInt64(self):
-    """Reads and returns a signed, varint-encoded, 64-bit integer."""
-    return self._stream.ReadVarint64()
-
-  def ReadUInt32(self):
-    """Reads and returns an signed, varint-encoded, 32-bit integer."""
-    return self._stream.ReadVarUInt32()
-
-  def ReadUInt64(self):
-    """Reads and returns an signed, varint-encoded,64-bit integer."""
-    return self._stream.ReadVarUInt64()
-
-  def ReadSInt32(self):
-    """Reads and returns a signed, zigzag-encoded, varint-encoded,
-    32-bit integer."""
-    return wire_format.ZigZagDecode(self._stream.ReadVarUInt32())
-
-  def ReadSInt64(self):
-    """Reads and returns a signed, zigzag-encoded, varint-encoded,
-    64-bit integer."""
-    return wire_format.ZigZagDecode(self._stream.ReadVarUInt64())
-
-  def ReadFixed32(self):
-    """Reads and returns an unsigned, fixed-width, 32-bit integer."""
-    return self._stream.ReadLittleEndian32()
-
-  def ReadFixed64(self):
-    """Reads and returns an unsigned, fixed-width, 64-bit integer."""
-    return self._stream.ReadLittleEndian64()
-
-  def ReadSFixed32(self):
-    """Reads and returns a signed, fixed-width, 32-bit integer."""
-    value = self._stream.ReadLittleEndian32()
-    if value >= (1 << 31):
-      value -= (1 << 32)
-    return value
-
-  def ReadSFixed64(self):
-    """Reads and returns a signed, fixed-width, 64-bit integer."""
-    value = self._stream.ReadLittleEndian64()
-    if value >= (1 << 63):
-      value -= (1 << 64)
-    return value
-
-  def ReadFloat(self):
-    """Reads and returns a 4-byte floating-point number."""
-    serialized = self._stream.ReadBytes(4)
-    return struct.unpack('f', serialized)[0]
-
-  def ReadDouble(self):
-    """Reads and returns an 8-byte floating-point number."""
-    serialized = self._stream.ReadBytes(8)
-    return struct.unpack('d', serialized)[0]
-
-  def ReadBool(self):
-    """Reads and returns a bool."""
-    i = self._stream.ReadVarUInt32()
-    return bool(i)
-
-  def ReadEnum(self):
-    """Reads and returns an enum value."""
-    return self._stream.ReadVarUInt32()
-
-  def ReadString(self):
-    """Reads and returns a length-delimited string."""
-    bytes = self.ReadBytes()
-    return unicode(bytes, 'utf-8')
-
-  def ReadBytes(self):
-    """Reads and returns a length-delimited byte sequence."""
-    length = self._stream.ReadVarUInt32()
-    return self._stream.ReadBytes(length)
-
-  def ReadMessageInto(self, msg):
-    """Calls msg.MergeFromString() to merge
-    length-delimited serialized message data into |msg|.
-
-    REQUIRES: The decoder must be positioned at the serialized "length"
-      prefix to a length-delmiited serialized message.
-
-    POSTCONDITION: The decoder is positioned just after the
-      serialized message, and we have merged those serialized
-      contents into |msg|.
-    """
-    length = self._stream.ReadVarUInt32()
-    sub_buffer = self._stream.GetSubBuffer(length)
-    num_bytes_used = msg.MergeFromString(sub_buffer)
-    if num_bytes_used != length:
-      raise message.DecodeError(
-          'Submessage told to deserialize from %d-byte encoding, '
-          'but used only %d bytes' % (length, num_bytes_used))
-    self._stream.SkipBytes(num_bytes_used)
-
-  def ReadGroupInto(self, expected_field_number, group):
-    """Calls group.MergeFromString() to merge
-    END_GROUP-delimited serialized message data into |group|.
-    We'll raise an exception if we don't find an END_GROUP
-    tag immediately after the serialized message contents.
-
-    REQUIRES: The decoder is positioned just after the START_GROUP
-      tag for this group.
-
-    POSTCONDITION: The decoder is positioned just after the
-      END_GROUP tag for this group, and we have merged
-      the contents of the group into |group|.
-    """
-    sub_buffer = self._stream.GetSubBuffer()  # No a priori length limit.
-    num_bytes_used = group.MergeFromString(sub_buffer)
-    if num_bytes_used < 0:
-      raise message.DecodeError('Group message reported negative bytes read.')
-    self._stream.SkipBytes(num_bytes_used)
-    field_number, field_type = self.ReadFieldNumberAndWireType()
-    if field_type != wire_format.WIRETYPE_END_GROUP:
-      raise message.DecodeError('Group message did not end with an END_GROUP.')
-    if field_number != expected_field_number:
-      raise message.DecodeError('END_GROUP tag had field '
-                                'number %d, was expecting field number %d' % (
-          field_number, expected_field_number))
-    # We're now positioned just after the END_GROUP tag.  Perfect.
diff --git a/froofle/protobuf/internal/encoder.py b/froofle/protobuf/internal/encoder.py
deleted file mode 100644
index 8b924b3..0000000
--- a/froofle/protobuf/internal/encoder.py
+++ /dev/null
@@ -1,206 +0,0 @@
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""Class for encoding protocol message primitives.
-
-Contains the logic for encoding every logical protocol field type
-into one of the 5 physical wire types.
-"""
-
-__author__ = 'robinson@google.com (Will Robinson)'
-
-import struct
-from froofle.protobuf import message
-from froofle.protobuf.internal import wire_format
-from froofle.protobuf.internal import output_stream
-
-
-# Note that much of this code is ported from //net/proto/ProtocolBuffer, and
-# that the interface is strongly inspired by WireFormat from the C++ proto2
-# implementation.
-
-
-class Encoder(object):
-
-  """Encodes logical protocol buffer fields to the wire format."""
-
-  def __init__(self):
-    self._stream = output_stream.OutputStream()
-
-  def ToString(self):
-    """Returns all values encoded in this object as a string."""
-    return self._stream.ToString()
-
-  # All the Append*() methods below first append a tag+type pair to the buffer
-  # before appending the specified value.
-
-  def AppendInt32(self, field_number, value):
-    """Appends a 32-bit integer to our buffer, varint-encoded."""
-    self._AppendTag(field_number, wire_format.WIRETYPE_VARINT)
-    self._stream.AppendVarint32(value)
-
-  def AppendInt64(self, field_number, value):
-    """Appends a 64-bit integer to our buffer, varint-encoded."""
-    self._AppendTag(field_number, wire_format.WIRETYPE_VARINT)
-    self._stream.AppendVarint64(value)
-
-  def AppendUInt32(self, field_number, unsigned_value):
-    """Appends an unsigned 32-bit integer to our buffer, varint-encoded."""
-    self._AppendTag(field_number, wire_format.WIRETYPE_VARINT)
-    self._stream.AppendVarUInt32(unsigned_value)
-
-  def AppendUInt64(self, field_number, unsigned_value):
-    """Appends an unsigned 64-bit integer to our buffer, varint-encoded."""
-    self._AppendTag(field_number, wire_format.WIRETYPE_VARINT)
-    self._stream.AppendVarUInt64(unsigned_value)
-
-  def AppendSInt32(self, field_number, value):
-    """Appends a 32-bit integer to our buffer, zigzag-encoded and then
-    varint-encoded.
-    """
-    self._AppendTag(field_number, wire_format.WIRETYPE_VARINT)
-    zigzag_value = wire_format.ZigZagEncode(value)
-    self._stream.AppendVarUInt32(zigzag_value)
-
-  def AppendSInt64(self, field_number, value):
-    """Appends a 64-bit integer to our buffer, zigzag-encoded and then
-    varint-encoded.
-    """
-    self._AppendTag(field_number, wire_format.WIRETYPE_VARINT)
-    zigzag_value = wire_format.ZigZagEncode(value)
-    self._stream.AppendVarUInt64(zigzag_value)
-
-  def AppendFixed32(self, field_number, unsigned_value):
-    """Appends an unsigned 32-bit integer to our buffer, in little-endian
-    byte-order.
-    """
-    self._AppendTag(field_number, wire_format.WIRETYPE_FIXED32)
-    self._stream.AppendLittleEndian32(unsigned_value)
-
-  def AppendFixed64(self, field_number, unsigned_value):
-    """Appends an unsigned 64-bit integer to our buffer, in little-endian
-    byte-order.
-    """
-    self._AppendTag(field_number, wire_format.WIRETYPE_FIXED64)
-    self._stream.AppendLittleEndian64(unsigned_value)
-
-  def AppendSFixed32(self, field_number, value):
-    """Appends a signed 32-bit integer to our buffer, in little-endian
-    byte-order.
-    """
-    sign = (value & 0x80000000) and -1 or 0
-    if value >> 32 != sign:
-      raise message.EncodeError('SFixed32 out of range: %d' % value)
-    self._AppendTag(field_number, wire_format.WIRETYPE_FIXED32)
-    self._stream.AppendLittleEndian32(value & 0xffffffff)
-
-  def AppendSFixed64(self, field_number, value):
-    """Appends a signed 64-bit integer to our buffer, in little-endian
-    byte-order.
-    """
-    sign = (value & 0x8000000000000000) and -1 or 0
-    if value >> 64 != sign:
-      raise message.EncodeError('SFixed64 out of range: %d' % value)
-    self._AppendTag(field_number, wire_format.WIRETYPE_FIXED64)
-    self._stream.AppendLittleEndian64(value & 0xffffffffffffffff)
-
-  def AppendFloat(self, field_number, value):
-    """Appends a floating-point number to our buffer."""
-    self._AppendTag(field_number, wire_format.WIRETYPE_FIXED32)
-    self._stream.AppendRawBytes(struct.pack('f', value))
-
-  def AppendDouble(self, field_number, value):
-    """Appends a double-precision floating-point number to our buffer."""
-    self._AppendTag(field_number, wire_format.WIRETYPE_FIXED64)
-    self._stream.AppendRawBytes(struct.pack('d', value))
-
-  def AppendBool(self, field_number, value):
-    """Appends a boolean to our buffer."""
-    self.AppendInt32(field_number, value)
-
-  def AppendEnum(self, field_number, value):
-    """Appends an enum value to our buffer."""
-    self.AppendInt32(field_number, value)
-
-  def AppendString(self, field_number, value):
-    """Appends a length-prefixed unicode string, encoded as UTF-8 to our buffer,
-    with the length varint-encoded.
-    """
-    self.AppendBytes(field_number, value.encode('utf-8'))
-
-  def AppendBytes(self, field_number, value):
-    """Appends a length-prefixed sequence of bytes to our buffer, with the
-    length varint-encoded.
-    """
-    self._AppendTag(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
-    self._stream.AppendVarUInt32(len(value))
-    self._stream.AppendRawBytes(value)
-
-  # TODO(robinson): For AppendGroup() and AppendMessage(), we'd really like to
-  # avoid the extra string copy here.  We can do so if we widen the Message
-  # interface to be able to serialize to a stream in addition to a string.  The
-  # challenge when thinking ahead to the Python/C API implementation of Message
-  # is finding a stream-like Python thing to which we can write raw bytes
-  # from C.  I'm not sure such a thing exists(?).  (array.array is pretty much
-  # what we want, but it's not directly exposed in the Python/C API).
-
-  def AppendGroup(self, field_number, group):
-    """Appends a group to our buffer.
-    """
-    self._AppendTag(field_number, wire_format.WIRETYPE_START_GROUP)
-    self._stream.AppendRawBytes(group.SerializeToString())
-    self._AppendTag(field_number, wire_format.WIRETYPE_END_GROUP)
-
-  def AppendMessage(self, field_number, msg):
-    """Appends a nested message to our buffer.
-    """
-    self._AppendTag(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
-    self._stream.AppendVarUInt32(msg.ByteSize())
-    self._stream.AppendRawBytes(msg.SerializeToString())
-
-  def AppendMessageSetItem(self, field_number, msg):
-    """Appends an item using the message set wire format.
-
-    The message set message looks like this:
-      message MessageSet {
-        repeated group Item = 1 {
-          required int32 type_id = 2;
-          required string message = 3;
-        }
-      }
-    """
-    self._AppendTag(1, wire_format.WIRETYPE_START_GROUP)
-    self.AppendInt32(2, field_number)
-    self.AppendMessage(3, msg)
-    self._AppendTag(1, wire_format.WIRETYPE_END_GROUP)
-
-  def _AppendTag(self, field_number, wire_type):
-    """Appends a tag containing field number and wire type information."""
-    self._stream.AppendVarUInt32(wire_format.PackTag(field_number, wire_type))
diff --git a/froofle/protobuf/internal/input_stream.py b/froofle/protobuf/internal/input_stream.py
deleted file mode 100644
index 26a26dc..0000000
--- a/froofle/protobuf/internal/input_stream.py
+++ /dev/null
@@ -1,326 +0,0 @@
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""InputStream is the primitive interface for reading bits from the wire.
-
-All protocol buffer deserialization can be expressed in terms of
-the InputStream primitives provided here.
-"""
-
-__author__ = 'robinson@google.com (Will Robinson)'
-
-import struct
-from array import array
-from froofle.protobuf import message
-from froofle.protobuf.internal import wire_format
-
-
-# Note that much of this code is ported from //net/proto/ProtocolBuffer, and
-# that the interface is strongly inspired by CodedInputStream from the C++
-# proto2 implementation.
-
-
-class InputStreamBuffer(object):
-
-  """Contains all logic for reading bits, and dealing with stream position.
-
-  If an InputStream method ever raises an exception, the stream is left
-  in an indeterminate state and is not safe for further use.
-  """
-
-  def __init__(self, s):
-    # What we really want is something like array('B', s), where elements we
-    # read from the array are already given to us as one-byte integers.  BUT
-    # using array() instead of buffer() would force full string copies to result
-    # from each GetSubBuffer() call.
-    #
-    # So, if the N serialized bytes of a single protocol buffer object are
-    # split evenly between 2 child messages, and so on recursively, using
-    # array('B', s) instead of buffer() would incur an additional N*logN bytes
-    # copied during deserialization.
-    #
-    # The higher constant overhead of having to ord() for every byte we read
-    # from the buffer in _ReadVarintHelper() could definitely lead to worse
-    # performance in many real-world scenarios, even if the asymptotic
-    # complexity is better.  However, our real answer is that the mythical
-    # Python/C extension module output mode for the protocol compiler will
-    # be blazing-fast and will eliminate most use of this class anyway.
-    self._buffer = buffer(s)
-    self._pos = 0
-
-  def EndOfStream(self):
-    """Returns true iff we're at the end of the stream.
-    If this returns true, then a call to any other InputStream method
-    will raise an exception.
-    """
-    return self._pos >= len(self._buffer)
-
-  def Position(self):
-    """Returns the current position in the stream, or equivalently, the
-    number of bytes read so far.
-    """
-    return self._pos
-
-  def GetSubBuffer(self, size=None):
-    """Returns a sequence-like object that represents a portion of our
-    underlying sequence.
-
-    Position 0 in the returned object corresponds to self.Position()
-    in this stream.
-
-    If size is specified, then the returned object ends after the
-    next "size" bytes in this stream.  If size is not specified,
-    then the returned object ends at the end of this stream.
-
-    We guarantee that the returned object R supports the Python buffer
-    interface (and thus that the call buffer(R) will work).
-
-    Note that the returned buffer is read-only.
-
-    The intended use for this method is for nested-message and nested-group
-    deserialization, where we want to make a recursive MergeFromString()
-    call on the portion of the original sequence that contains the serialized
-    nested message.  (And we'd like to do so without making unnecessary string
-    copies).
-
-    REQUIRES: size is nonnegative.
-    """
-    # Note that buffer() doesn't perform any actual string copy.
-    if size is None:
-      return buffer(self._buffer, self._pos)
-    else:
-      if size < 0:
-        raise message.DecodeError('Negative size %d' % size)
-      return buffer(self._buffer, self._pos, size)
-
-  def SkipBytes(self, num_bytes):
-    """Skip num_bytes bytes ahead, or go to the end of the stream, whichever
-    comes first.
-
-    REQUIRES: num_bytes is nonnegative.
-    """
-    if num_bytes < 0:
-      raise message.DecodeError('Negative num_bytes %d' % num_bytes)
-    self._pos += num_bytes
-    self._pos = min(self._pos, len(self._buffer))
-
-  def ReadBytes(self, size):
-    """Reads up to 'size' bytes from the stream, stopping early
-    only if we reach the end of the stream.  Returns the bytes read
-    as a string.
-    """
-    if size < 0:
-      raise message.DecodeError('Negative size %d' % size)
-    s = (self._buffer[self._pos : self._pos + size])
-    self._pos += len(s)  # Only advance by the number of bytes actually read.
-    return s
-
-  def ReadLittleEndian32(self):
-    """Interprets the next 4 bytes of the stream as a little-endian
-    encoded, unsiged 32-bit integer, and returns that integer.
-    """
-    try:
-      i = struct.unpack(wire_format.FORMAT_UINT32_LITTLE_ENDIAN,
-                        self._buffer[self._pos : self._pos + 4])
-      self._pos += 4
-      return i[0]  # unpack() result is a 1-element tuple.
-    except struct.error, e:
-      raise message.DecodeError(e)
-
-  def ReadLittleEndian64(self):
-    """Interprets the next 8 bytes of the stream as a little-endian
-    encoded, unsiged 64-bit integer, and returns that integer.
-    """
-    try:
-      i = struct.unpack(wire_format.FORMAT_UINT64_LITTLE_ENDIAN,
-                        self._buffer[self._pos : self._pos + 8])
-      self._pos += 8
-      return i[0]  # unpack() result is a 1-element tuple.
-    except struct.error, e:
-      raise message.DecodeError(e)
-
-  def ReadVarint32(self):
-    """Reads a varint from the stream, interprets this varint
-    as a signed, 32-bit integer, and returns the integer.
-    """
-    i = self.ReadVarint64()
-    if not wire_format.INT32_MIN <= i <= wire_format.INT32_MAX:
-      raise message.DecodeError('Value out of range for int32: %d' % i)
-    return int(i)
-
-  def ReadVarUInt32(self):
-    """Reads a varint from the stream, interprets this varint
-    as an unsigned, 32-bit integer, and returns the integer.
-    """
-    i = self.ReadVarUInt64()
-    if i > wire_format.UINT32_MAX:
-      raise message.DecodeError('Value out of range for uint32: %d' % i)
-    return i
-
-  def ReadVarint64(self):
-    """Reads a varint from the stream, interprets this varint
-    as a signed, 64-bit integer, and returns the integer.
-    """
-    i = self.ReadVarUInt64()
-    if i > wire_format.INT64_MAX:
-      i -= (1 << 64)
-    return i
-
-  def ReadVarUInt64(self):
-    """Reads a varint from the stream, interprets this varint
-    as an unsigned, 64-bit integer, and returns the integer.
-    """
-    i = self._ReadVarintHelper()
-    if not 0 <= i <= wire_format.UINT64_MAX:
-      raise message.DecodeError('Value out of range for uint64: %d' % i)
-    return i
-
-  def _ReadVarintHelper(self):
-    """Helper for the various varint-reading methods above.
-    Reads an unsigned, varint-encoded integer from the stream and
-    returns this integer.
-
-    Does no bounds checking except to ensure that we read at most as many bytes
-    as could possibly be present in a varint-encoded 64-bit number.
-    """
-    result = 0
-    shift = 0
-    while 1:
-      if shift >= 64:
-        raise message.DecodeError('Too many bytes when decoding varint.')
-      try:
-        b = ord(self._buffer[self._pos])
-      except IndexError:
-        raise message.DecodeError('Truncated varint.')
-      self._pos += 1
-      result |= ((b & 0x7f) << shift)
-      shift += 7
-      if not (b & 0x80):
-        return result
-
-class InputStreamArray(object):
-  def __init__(self, s):
-    self._buffer = array('B', s)
-    self._pos = 0
-
-  def EndOfStream(self):
-    return self._pos >= len(self._buffer)
-
-  def Position(self):
-    return self._pos
-
-  def GetSubBuffer(self, size=None):
-    if size is None:
-      return self._buffer[self._pos : ].tostring()
-    else:
-      if size < 0:
-        raise message.DecodeError('Negative size %d' % size)
-      return self._buffer[self._pos : self._pos + size].tostring()
-
-  def SkipBytes(self, num_bytes):
-    if num_bytes < 0:
-      raise message.DecodeError('Negative num_bytes %d' % num_bytes)
-    self._pos += num_bytes
-    self._pos = min(self._pos, len(self._buffer))
-
-  def ReadBytes(self, size):
-    if size < 0:
-      raise message.DecodeError('Negative size %d' % size)
-    s = self._buffer[self._pos : self._pos + size].tostring()
-    self._pos += len(s)  # Only advance by the number of bytes actually read.
-    return s
-
-  def ReadLittleEndian32(self):
-    try:
-      i = struct.unpack(wire_format.FORMAT_UINT32_LITTLE_ENDIAN,
-                        self._buffer[self._pos : self._pos + 4])
-      self._pos += 4
-      return i[0]  # unpack() result is a 1-element tuple.
-    except struct.error, e:
-      raise message.DecodeError(e)
-
-  def ReadLittleEndian64(self):
-    try:
-      i = struct.unpack(wire_format.FORMAT_UINT64_LITTLE_ENDIAN,
-                        self._buffer[self._pos : self._pos + 8])
-      self._pos += 8
-      return i[0]  # unpack() result is a 1-element tuple.
-    except struct.error, e:
-      raise message.DecodeError(e)
-
-  def ReadVarint32(self):
-    i = self.ReadVarint64()
-    if not wire_format.INT32_MIN <= i <= wire_format.INT32_MAX:
-      raise message.DecodeError('Value out of range for int32: %d' % i)
-    return int(i)
-
-  def ReadVarUInt32(self):
-    i = self.ReadVarUInt64()
-    if i > wire_format.UINT32_MAX:
-      raise message.DecodeError('Value out of range for uint32: %d' % i)
-    return i
-
-  def ReadVarint64(self):
-    i = self.ReadVarUInt64()
-    if i > wire_format.INT64_MAX:
-      i -= (1 << 64)
-    return i
-
-  def ReadVarUInt64(self):
-    i = self._ReadVarintHelper()
-    if not 0 <= i <= wire_format.UINT64_MAX:
-      raise message.DecodeError('Value out of range for uint64: %d' % i)
-    return i
-
-  def _ReadVarintHelper(self):
-    result = 0
-    shift = 0
-    while 1:
-      if shift >= 64:
-        raise message.DecodeError('Too many bytes when decoding varint.')
-      try:
-        b = self._buffer[self._pos]
-      except IndexError:
-        raise message.DecodeError('Truncated varint.')
-      self._pos += 1
-      result |= ((b & 0x7f) << shift)
-      shift += 7
-      if not (b & 0x80):
-        return result
-
-try:
-  buffer("")
-  InputStream = InputStreamBuffer
-except NotImplementedError:
-  # Google App Engine: dev_appserver.py
-  InputStream = InputStreamArray
-except RuntimeError:
-  # Google App Engine: production
-  InputStream = InputStreamArray
diff --git a/froofle/protobuf/internal/message_listener.py b/froofle/protobuf/internal/message_listener.py
deleted file mode 100644
index 4397895..0000000
--- a/froofle/protobuf/internal/message_listener.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""Defines a listener interface for observing certain
-state transitions on Message objects.
-
-Also defines a null implementation of this interface.
-"""
-
-__author__ = 'robinson@google.com (Will Robinson)'
-
-
-class MessageListener(object):
-
-  """Listens for transitions to nonempty and for invalidations of cached
-  byte sizes.  Meant to be registered via Message._SetListener().
-  """
-
-  def TransitionToNonempty(self):
-    """Called the *first* time that this message becomes nonempty.
-    Implementations are free (but not required) to call this method multiple
-    times after the message has become nonempty.
-    """
-    raise NotImplementedError
-
-  def ByteSizeDirty(self):
-    """Called *every* time the cached byte size value
-    for this object is invalidated (transitions from being
-    "clean" to "dirty").
-    """
-    raise NotImplementedError
-
-
-class NullMessageListener(object):
-
-  """No-op MessageListener implementation."""
-
-  def TransitionToNonempty(self):
-    pass
-
-  def ByteSizeDirty(self):
-    pass
diff --git a/froofle/protobuf/internal/output_stream.py b/froofle/protobuf/internal/output_stream.py
deleted file mode 100644
index f62cd1c..0000000
--- a/froofle/protobuf/internal/output_stream.py
+++ /dev/null
@@ -1,125 +0,0 @@
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""OutputStream is the primitive interface for sticking bits on the wire.
-
-All protocol buffer serialization can be expressed in terms of
-the OutputStream primitives provided here.
-"""
-
-__author__ = 'robinson@google.com (Will Robinson)'
-
-import array
-import struct
-from froofle.protobuf import message
-from froofle.protobuf.internal import wire_format
-
-
-
-# Note that much of this code is ported from //net/proto/ProtocolBuffer, and
-# that the interface is strongly inspired by CodedOutputStream from the C++
-# proto2 implementation.
-
-
-class OutputStream(object):
-
-  """Contains all logic for writing bits, and ToString() to get the result."""
-
-  def __init__(self):
-    self._buffer = array.array('B')
-
-  def AppendRawBytes(self, raw_bytes):
-    """Appends raw_bytes to our internal buffer."""
-    self._buffer.fromstring(raw_bytes)
-
-  def AppendLittleEndian32(self, unsigned_value):
-    """Appends an unsigned 32-bit integer to the internal buffer,
-    in little-endian byte order.
-    """
-    if not 0 <= unsigned_value <= wire_format.UINT32_MAX:
-      raise message.EncodeError(
-          'Unsigned 32-bit out of range: %d' % unsigned_value)
-    self._buffer.fromstring(struct.pack(
-        wire_format.FORMAT_UINT32_LITTLE_ENDIAN, unsigned_value))
-
-  def AppendLittleEndian64(self, unsigned_value):
-    """Appends an unsigned 64-bit integer to the internal buffer,
-    in little-endian byte order.
-    """
-    if not 0 <= unsigned_value <= wire_format.UINT64_MAX:
-      raise message.EncodeError(
-          'Unsigned 64-bit out of range: %d' % unsigned_value)
-    self._buffer.fromstring(struct.pack(
-        wire_format.FORMAT_UINT64_LITTLE_ENDIAN, unsigned_value))
-
-  def AppendVarint32(self, value):
-    """Appends a signed 32-bit integer to the internal buffer,
-    encoded as a varint.  (Note that a negative varint32 will
-    always require 10 bytes of space.)
-    """
-    if not wire_format.INT32_MIN <= value <= wire_format.INT32_MAX:
-      raise message.EncodeError('Value out of range: %d' % value)
-    self.AppendVarint64(value)
-
-  def AppendVarUInt32(self, value):
-    """Appends an unsigned 32-bit integer to the internal buffer,
-    encoded as a varint.
-    """
-    if not 0 <= value <= wire_format.UINT32_MAX:
-      raise message.EncodeError('Value out of range: %d' % value)
-    self.AppendVarUInt64(value)
-
-  def AppendVarint64(self, value):
-    """Appends a signed 64-bit integer to the internal buffer,
-    encoded as a varint.
-    """
-    if not wire_format.INT64_MIN <= value <= wire_format.INT64_MAX:
-      raise message.EncodeError('Value out of range: %d' % value)
-    if value < 0:
-      value += (1 << 64)
-    self.AppendVarUInt64(value)
-
-  def AppendVarUInt64(self, unsigned_value):
-    """Appends an unsigned 64-bit integer to the internal buffer,
-    encoded as a varint.
-    """
-    if not 0 <= unsigned_value <= wire_format.UINT64_MAX:
-      raise message.EncodeError('Value out of range: %d' % unsigned_value)
-    while True:
-      bits = unsigned_value & 0x7f
-      unsigned_value >>= 7
-      if not unsigned_value:
-        self._buffer.append(bits)
-        break
-      self._buffer.append(0x80|bits)
-
-  def ToString(self):
-    """Returns a string containing the bytes in our internal buffer."""
-    return self._buffer.tostring()
diff --git a/froofle/protobuf/internal/type_checkers.py b/froofle/protobuf/internal/type_checkers.py
deleted file mode 100644
index aaf7a84..0000000
--- a/froofle/protobuf/internal/type_checkers.py
+++ /dev/null
@@ -1,268 +0,0 @@
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""Provides type checking routines.
-
-This module defines type checking utilities in the forms of dictionaries:
-
-VALUE_CHECKERS: A dictionary of field types and a value validation object.
-TYPE_TO_BYTE_SIZE_FN: A dictionary with field types and a size computing
-  function.
-TYPE_TO_SERIALIZE_METHOD: A dictionary with field types and serialization
-  function.
-FIELD_TYPE_TO_WIRE_TYPE: A dictionary with field typed and their
-  coresponding wire types.
-TYPE_TO_DESERIALIZE_METHOD: A dictionary with field types and deserialization
-  function.
-"""
-
-__author__ = 'robinson@google.com (Will Robinson)'
-
-from froofle.protobuf.internal import decoder
-from froofle.protobuf.internal import encoder
-from froofle.protobuf.internal import wire_format
-from froofle.protobuf import descriptor
-
-_FieldDescriptor = descriptor.FieldDescriptor
-
-
-def GetTypeChecker(cpp_type, field_type):
-  """Returns a type checker for a message field of the specified types.
-
-  Args:
-    cpp_type: C++ type of the field (see descriptor.py).
-    field_type: Protocol message field type (see descriptor.py).
-
-  Returns:
-    An instance of TypeChecker which can be used to verify the types
-    of values assigned to a field of the specified type.
-  """
-  if (cpp_type == _FieldDescriptor.CPPTYPE_STRING and
-      field_type == _FieldDescriptor.TYPE_STRING):
-    return UnicodeValueChecker()
-  return _VALUE_CHECKERS[cpp_type]
-
-
-# None of the typecheckers below make any attempt to guard against people
-# subclassing builtin types and doing weird things.  We're not trying to
-# protect against malicious clients here, just people accidentally shooting
-# themselves in the foot in obvious ways.
-
-class TypeChecker(object):
-
-  """Type checker used to catch type errors as early as possible
-  when the client is setting scalar fields in protocol messages.
-  """
-
-  def __init__(self, *acceptable_types):
-    self._acceptable_types = acceptable_types
-
-  def CheckValue(self, proposed_value):
-    if not isinstance(proposed_value, self._acceptable_types):
-      message = ('%.1024r has type %s, but expected one of: %s' %
-                 (proposed_value, type(proposed_value), self._acceptable_types))
-      raise TypeError(message)
-
-
-# IntValueChecker and its subclasses perform integer type-checks
-# and bounds-checks.
-class IntValueChecker(object):
-
-  """Checker used for integer fields.  Performs type-check and range check."""
-
-  def CheckValue(self, proposed_value):
-    if not isinstance(proposed_value, (int, long)):
-      message = ('%.1024r has type %s, but expected one of: %s' %
-                 (proposed_value, type(proposed_value), (int, long)))
-      raise TypeError(message)
-    if not self._MIN <= proposed_value <= self._MAX:
-      raise ValueError('Value out of range: %d' % proposed_value)
-
-
-class UnicodeValueChecker(object):
-
-  """Checker used for string fields."""
-
-  def CheckValue(self, proposed_value):
-    if not isinstance(proposed_value, (str, unicode)):
-      message = ('%.1024r has type %s, but expected one of: %s' %
-                 (proposed_value, type(proposed_value), (str, unicode)))
-      raise TypeError(message)
-
-    # If the value is of type 'str' make sure that it is in 7-bit ASCII
-    # encoding.
-    if isinstance(proposed_value, str):
-      try:
-        unicode(proposed_value, 'ascii')
-      except UnicodeDecodeError:
-        raise ValueError('%.1024r isn\'t in 7-bit ASCII encoding.'
-                         % (proposed_value))
-
-
-class Int32ValueChecker(IntValueChecker):
-  # We're sure to use ints instead of longs here since comparison may be more
-  # efficient.
-  _MIN = -2147483648
-  _MAX = 2147483647
-
-
-class Uint32ValueChecker(IntValueChecker):
-  _MIN = 0
-  _MAX = (1 << 32) - 1
-
-
-class Int64ValueChecker(IntValueChecker):
-  _MIN = -(1 << 63)
-  _MAX = (1 << 63) - 1
-
-
-class Uint64ValueChecker(IntValueChecker):
-  _MIN = 0
-  _MAX = (1 << 64) - 1
-
-
-# Type-checkers for all scalar CPPTYPEs.
-_VALUE_CHECKERS = {
-    _FieldDescriptor.CPPTYPE_INT32: Int32ValueChecker(),
-    _FieldDescriptor.CPPTYPE_INT64: Int64ValueChecker(),
-    _FieldDescriptor.CPPTYPE_UINT32: Uint32ValueChecker(),
-    _FieldDescriptor.CPPTYPE_UINT64: Uint64ValueChecker(),
-    _FieldDescriptor.CPPTYPE_DOUBLE: TypeChecker(
-        float, int, long),
-    _FieldDescriptor.CPPTYPE_FLOAT: TypeChecker(
-        float, int, long),
-    _FieldDescriptor.CPPTYPE_BOOL: TypeChecker(bool, int),
-    _FieldDescriptor.CPPTYPE_ENUM: Int32ValueChecker(),
-    _FieldDescriptor.CPPTYPE_STRING: TypeChecker(str),
-    }
-
-
-# Map from field type to a function F, such that F(field_num, value)
-# gives the total byte size for a value of the given type.  This
-# byte size includes tag information and any other additional space
-# associated with serializing "value".
-TYPE_TO_BYTE_SIZE_FN = {
-    _FieldDescriptor.TYPE_DOUBLE: wire_format.DoubleByteSize,
-    _FieldDescriptor.TYPE_FLOAT: wire_format.FloatByteSize,
-    _FieldDescriptor.TYPE_INT64: wire_format.Int64ByteSize,
-    _FieldDescriptor.TYPE_UINT64: wire_format.UInt64ByteSize,
-    _FieldDescriptor.TYPE_INT32: wire_format.Int32ByteSize,
-    _FieldDescriptor.TYPE_FIXED64: wire_format.Fixed64ByteSize,
-    _FieldDescriptor.TYPE_FIXED32: wire_format.Fixed32ByteSize,
-    _FieldDescriptor.TYPE_BOOL: wire_format.BoolByteSize,
-    _FieldDescriptor.TYPE_STRING: wire_format.StringByteSize,
-    _FieldDescriptor.TYPE_GROUP: wire_format.GroupByteSize,
-    _FieldDescriptor.TYPE_MESSAGE: wire_format.MessageByteSize,
-    _FieldDescriptor.TYPE_BYTES: wire_format.BytesByteSize,
-    _FieldDescriptor.TYPE_UINT32: wire_format.UInt32ByteSize,
-    _FieldDescriptor.TYPE_ENUM: wire_format.EnumByteSize,
-    _FieldDescriptor.TYPE_SFIXED32: wire_format.SFixed32ByteSize,
-    _FieldDescriptor.TYPE_SFIXED64: wire_format.SFixed64ByteSize,
-    _FieldDescriptor.TYPE_SINT32: wire_format.SInt32ByteSize,
-    _FieldDescriptor.TYPE_SINT64: wire_format.SInt64ByteSize
-    }
-
-
-# Maps from field type to an unbound Encoder method F, such that
-# F(encoder, field_number, value) will append the serialization
-# of a value of this type to the encoder.
-_Encoder = encoder.Encoder
-TYPE_TO_SERIALIZE_METHOD = {
-    _FieldDescriptor.TYPE_DOUBLE: _Encoder.AppendDouble,
-    _FieldDescriptor.TYPE_FLOAT: _Encoder.AppendFloat,
-    _FieldDescriptor.TYPE_INT64: _Encoder.AppendInt64,
-    _FieldDescriptor.TYPE_UINT64: _Encoder.AppendUInt64,
-    _FieldDescriptor.TYPE_INT32: _Encoder.AppendInt32,
-    _FieldDescriptor.TYPE_FIXED64: _Encoder.AppendFixed64,
-    _FieldDescriptor.TYPE_FIXED32: _Encoder.AppendFixed32,
-    _FieldDescriptor.TYPE_BOOL: _Encoder.AppendBool,
-    _FieldDescriptor.TYPE_STRING: _Encoder.AppendString,
-    _FieldDescriptor.TYPE_GROUP: _Encoder.AppendGroup,
-    _FieldDescriptor.TYPE_MESSAGE: _Encoder.AppendMessage,
-    _FieldDescriptor.TYPE_BYTES: _Encoder.AppendBytes,
-    _FieldDescriptor.TYPE_UINT32: _Encoder.AppendUInt32,
-    _FieldDescriptor.TYPE_ENUM: _Encoder.AppendEnum,
-    _FieldDescriptor.TYPE_SFIXED32: _Encoder.AppendSFixed32,
-    _FieldDescriptor.TYPE_SFIXED64: _Encoder.AppendSFixed64,
-    _FieldDescriptor.TYPE_SINT32: _Encoder.AppendSInt32,
-    _FieldDescriptor.TYPE_SINT64: _Encoder.AppendSInt64,
-    }
-
-
-# Maps from field type to expected wiretype.
-FIELD_TYPE_TO_WIRE_TYPE = {
-    _FieldDescriptor.TYPE_DOUBLE: wire_format.WIRETYPE_FIXED64,
-    _FieldDescriptor.TYPE_FLOAT: wire_format.WIRETYPE_FIXED32,
-    _FieldDescriptor.TYPE_INT64: wire_format.WIRETYPE_VARINT,
-    _FieldDescriptor.TYPE_UINT64: wire_format.WIRETYPE_VARINT,
-    _FieldDescriptor.TYPE_INT32: wire_format.WIRETYPE_VARINT,
-    _FieldDescriptor.TYPE_FIXED64: wire_format.WIRETYPE_FIXED64,
-    _FieldDescriptor.TYPE_FIXED32: wire_format.WIRETYPE_FIXED32,
-    _FieldDescriptor.TYPE_BOOL: wire_format.WIRETYPE_VARINT,
-    _FieldDescriptor.TYPE_STRING:
-      wire_format.WIRETYPE_LENGTH_DELIMITED,
-    _FieldDescriptor.TYPE_GROUP: wire_format.WIRETYPE_START_GROUP,
-    _FieldDescriptor.TYPE_MESSAGE:
-      wire_format.WIRETYPE_LENGTH_DELIMITED,
-    _FieldDescriptor.TYPE_BYTES:
-      wire_format.WIRETYPE_LENGTH_DELIMITED,
-    _FieldDescriptor.TYPE_UINT32: wire_format.WIRETYPE_VARINT,
-    _FieldDescriptor.TYPE_ENUM: wire_format.WIRETYPE_VARINT,
-    _FieldDescriptor.TYPE_SFIXED32: wire_format.WIRETYPE_FIXED32,
-    _FieldDescriptor.TYPE_SFIXED64: wire_format.WIRETYPE_FIXED64,
-    _FieldDescriptor.TYPE_SINT32: wire_format.WIRETYPE_VARINT,
-    _FieldDescriptor.TYPE_SINT64: wire_format.WIRETYPE_VARINT,
-    }
-
-
-# Maps from field type to an unbound Decoder method F,
-# such that F(decoder) will read a field of the requested type.
-#
-# Note that Message and Group are intentionally missing here.
-# They're handled by _RecursivelyMerge().
-_Decoder = decoder.Decoder
-TYPE_TO_DESERIALIZE_METHOD = {
-    _FieldDescriptor.TYPE_DOUBLE: _Decoder.ReadDouble,
-    _FieldDescriptor.TYPE_FLOAT: _Decoder.ReadFloat,
-    _FieldDescriptor.TYPE_INT64: _Decoder.ReadInt64,
-    _FieldDescriptor.TYPE_UINT64: _Decoder.ReadUInt64,
-    _FieldDescriptor.TYPE_INT32: _Decoder.ReadInt32,
-    _FieldDescriptor.TYPE_FIXED64: _Decoder.ReadFixed64,
-    _FieldDescriptor.TYPE_FIXED32: _Decoder.ReadFixed32,
-    _FieldDescriptor.TYPE_BOOL: _Decoder.ReadBool,
-    _FieldDescriptor.TYPE_STRING: _Decoder.ReadString,
-    _FieldDescriptor.TYPE_BYTES: _Decoder.ReadBytes,
-    _FieldDescriptor.TYPE_UINT32: _Decoder.ReadUInt32,
-    _FieldDescriptor.TYPE_ENUM: _Decoder.ReadEnum,
-    _FieldDescriptor.TYPE_SFIXED32: _Decoder.ReadSFixed32,
-    _FieldDescriptor.TYPE_SFIXED64: _Decoder.ReadSFixed64,
-    _FieldDescriptor.TYPE_SINT32: _Decoder.ReadSInt32,
-    _FieldDescriptor.TYPE_SINT64: _Decoder.ReadSInt64,
-    }
diff --git a/froofle/protobuf/internal/wire_format.py b/froofle/protobuf/internal/wire_format.py
deleted file mode 100644
index 4d823c8..0000000
--- a/froofle/protobuf/internal/wire_format.py
+++ /dev/null
@@ -1,236 +0,0 @@
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""Constants and static functions to support protocol buffer wire format."""
-
-__author__ = 'robinson@google.com (Will Robinson)'
-
-import struct
-from froofle.protobuf import message
-
-
-TAG_TYPE_BITS = 3  # Number of bits used to hold type info in a proto tag.
-_TAG_TYPE_MASK = (1 << TAG_TYPE_BITS) - 1  # 0x7
-
-# These numbers identify the wire type of a protocol buffer value.
-# We use the least-significant TAG_TYPE_BITS bits of the varint-encoded
-# tag-and-type to store one of these WIRETYPE_* constants.
-# These values must match WireType enum in //net/proto2/public/wire_format.h.
-WIRETYPE_VARINT = 0
-WIRETYPE_FIXED64 = 1
-WIRETYPE_LENGTH_DELIMITED = 2
-WIRETYPE_START_GROUP = 3
-WIRETYPE_END_GROUP = 4
-WIRETYPE_FIXED32 = 5
-_WIRETYPE_MAX = 5
-
-
-# Bounds for various integer types.
-INT32_MAX = int((1 << 31) - 1)
-INT32_MIN = int(-(1 << 31))
-UINT32_MAX = (1 << 32) - 1
-
-INT64_MAX = (1 << 63) - 1
-INT64_MIN = -(1 << 63)
-UINT64_MAX = (1 << 64) - 1
-
-# "struct" format strings that will encode/decode the specified formats.
-FORMAT_UINT32_LITTLE_ENDIAN = '<I'
-FORMAT_UINT64_LITTLE_ENDIAN = '<Q'
-
-
-# We'll have to provide alternate implementations of AppendLittleEndian*() on
-# any architectures where these checks fail.
-if struct.calcsize(FORMAT_UINT32_LITTLE_ENDIAN) != 4:
-  raise AssertionError('Format "I" is not a 32-bit number.')
-if struct.calcsize(FORMAT_UINT64_LITTLE_ENDIAN) != 8:
-  raise AssertionError('Format "Q" is not a 64-bit number.')
-
-
-def PackTag(field_number, wire_type):
-  """Returns an unsigned 32-bit integer that encodes the field number and
-  wire type information in standard protocol message wire format.
-
-  Args:
-    field_number: Expected to be an integer in the range [1, 1 << 29)
-    wire_type: One of the WIRETYPE_* constants.
-  """
-  if not 0 <= wire_type <= _WIRETYPE_MAX:
-    raise message.EncodeError('Unknown wire type: %d' % wire_type)
-  return (field_number << TAG_TYPE_BITS) | wire_type
-
-
-def UnpackTag(tag):
-  """The inverse of PackTag().  Given an unsigned 32-bit number,
-  returns a (field_number, wire_type) tuple.
-  """
-  return (tag >> TAG_TYPE_BITS), (tag & _TAG_TYPE_MASK)
-
-
-def ZigZagEncode(value):
-  """ZigZag Transform:  Encodes signed integers so that they can be
-  effectively used with varint encoding.  See wire_format.h for
-  more details.
-  """
-  if value >= 0:
-    return value << 1
-  return (value << 1) ^ (~0)
-
-
-def ZigZagDecode(value):
-  """Inverse of ZigZagEncode()."""
-  if not value & 0x1:
-    return value >> 1
-  return (value >> 1) ^ (~0)
-
-
-
-# The *ByteSize() functions below return the number of bytes required to
-# serialize "field number + type" information and then serialize the value.
-
-
-def Int32ByteSize(field_number, int32):
-  return Int64ByteSize(field_number, int32)
-
-
-def Int64ByteSize(field_number, int64):
-  # Have to convert to uint before calling UInt64ByteSize().
-  return UInt64ByteSize(field_number, 0xffffffffffffffff & int64)
-
-
-def UInt32ByteSize(field_number, uint32):
-  return UInt64ByteSize(field_number, uint32)
-
-
-def UInt64ByteSize(field_number, uint64):
-  return _TagByteSize(field_number) + _VarUInt64ByteSizeNoTag(uint64)
-
-
-def SInt32ByteSize(field_number, int32):
-  return UInt32ByteSize(field_number, ZigZagEncode(int32))
-
-
-def SInt64ByteSize(field_number, int64):
-  return UInt64ByteSize(field_number, ZigZagEncode(int64))
-
-
-def Fixed32ByteSize(field_number, fixed32):
-  return _TagByteSize(field_number) + 4
-
-
-def Fixed64ByteSize(field_number, fixed64):
-  return _TagByteSize(field_number) + 8
-
-
-def SFixed32ByteSize(field_number, sfixed32):
-  return _TagByteSize(field_number) + 4
-
-
-def SFixed64ByteSize(field_number, sfixed64):
-  return _TagByteSize(field_number) + 8
-
-
-def FloatByteSize(field_number, flt):
-  return _TagByteSize(field_number) + 4
-
-
-def DoubleByteSize(field_number, double):
-  return _TagByteSize(field_number) + 8
-
-
-def BoolByteSize(field_number, b):
-  return _TagByteSize(field_number) + 1
-
-
-def EnumByteSize(field_number, enum):
-  return UInt32ByteSize(field_number, enum)
-
-
-def StringByteSize(field_number, string):
-  return BytesByteSize(field_number, string.encode('utf-8'))
-
-
-def BytesByteSize(field_number, b):
-  return (_TagByteSize(field_number)
-          + _VarUInt64ByteSizeNoTag(len(b))
-          + len(b))
-
-
-def GroupByteSize(field_number, message):
-  return (2 * _TagByteSize(field_number)  # START and END group.
-          + message.ByteSize())
-
-
-def MessageByteSize(field_number, message):
-  return (_TagByteSize(field_number)
-          + _VarUInt64ByteSizeNoTag(message.ByteSize())
-          + message.ByteSize())
-
-
-def MessageSetItemByteSize(field_number, msg):
-  # First compute the sizes of the tags.
-  # There are 2 tags for the beginning and ending of the repeated group, that
-  # is field number 1, one with field number 2 (type_id) and one with field
-  # number 3 (message).
-  total_size = (2 * _TagByteSize(1) + _TagByteSize(2) + _TagByteSize(3))
-
-  # Add the number of bytes for type_id.
-  total_size += _VarUInt64ByteSizeNoTag(field_number)
-
-  message_size = msg.ByteSize()
-
-  # The number of bytes for encoding the length of the message.
-  total_size += _VarUInt64ByteSizeNoTag(message_size)
-
-  # The size of the message.
-  total_size += message_size
-  return total_size
-
-
-# Private helper functions for the *ByteSize() functions above.
-
-
-def _TagByteSize(field_number):
-  """Returns the bytes required to serialize a tag with this field number."""
-  # Just pass in type 0, since the type won't affect the tag+type size.
-  return _VarUInt64ByteSizeNoTag(PackTag(field_number, 0))
-
-
-def _VarUInt64ByteSizeNoTag(uint64):
-  """Returns the bytes required to serialize a single varint.
-  uint64 must be unsigned.
-  """
-  if uint64 > UINT64_MAX:
-    raise message.EncodeError('Value out of range: %d' % uint64)
-  bytes = 1
-  while uint64 > 0x7f:
-    bytes += 1
-    uint64 >>= 7
-  return bytes
diff --git a/froofle/protobuf/message.py b/froofle/protobuf/message.py
deleted file mode 100644
index ed71485..0000000
--- a/froofle/protobuf/message.py
+++ /dev/null
@@ -1,246 +0,0 @@
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# TODO(robinson): We should just make these methods all "pure-virtual" and move
-# all implementation out, into reflection.py for now.
-
-
-"""Contains an abstract base class for protocol messages."""
-
-__author__ = 'robinson@google.com (Will Robinson)'
-
-from froofle.protobuf import text_format
-
-class Error(Exception): pass
-class DecodeError(Error): pass
-class EncodeError(Error): pass
-
-
-class Message(object):
-
-  """Abstract base class for protocol messages.
-
-  Protocol message classes are almost always generated by the protocol
-  compiler.  These generated types subclass Message and implement the methods
-  shown below.
-
-  TODO(robinson): Link to an HTML document here.
-
-  TODO(robinson): Document that instances of this class will also
-  have an Extensions attribute with __getitem__ and __setitem__.
-  Again, not sure how to best convey this.
-
-  TODO(robinson): Document that the class must also have a static
-    RegisterExtension(extension_field) method.
-    Not sure how to best express at this point.
-  """
-
-  # TODO(robinson): Document these fields and methods.
-
-  __slots__ = []
-
-  DESCRIPTOR = None
-
-  def __eq__(self, other_msg):
-    raise NotImplementedError
-
-  def __ne__(self, other_msg):
-    # Can't just say self != other_msg, since that would infinitely recurse. :)
-    return not self == other_msg
-
-  def __str__(self):
-    return text_format.MessageToString(self)
-
-  def MergeFrom(self, other_msg):
-    """Merges the contents of the specified message into current message.
-
-    This method merges the contents of the specified message into the current
-    message. Singular fields that are set in the specified message overwrite
-    the corresponding fields in the current message. Repeated fields are
-    appended. Singular sub-messages and groups are recursively merged.
-
-    Args:
-      other_msg: Message to merge into the current message.
-    """
-    raise NotImplementedError
-
-  def CopyFrom(self, other_msg):
-    """Copies the content of the specified message into the current message.
-
-    The method clears the current message and then merges the specified
-    message using MergeFrom.
-
-    Args:
-      other_msg: Message to copy into the current one.
-    """
-    if self == other_msg:
-      return
-    self.Clear()
-    self.MergeFrom(other_msg)
-
-  def Clear(self):
-    """Clears all data that was set in the message."""
-    raise NotImplementedError
-
-  def IsInitialized(self):
-    """Checks if the message is initialized.
-
-    Returns:
-      The method returns True if the message is initialized (i.e. all of its
-      required fields are set).
-    """
-    raise NotImplementedError
-
-  # TODO(robinson): MergeFromString() should probably return None and be
-  # implemented in terms of a helper that returns the # of bytes read.  Our
-  # deserialization routines would use the helper when recursively
-  # deserializing, but the end user would almost always just want the no-return
-  # MergeFromString().
-
-  def MergeFromString(self, serialized):
-    """Merges serialized protocol buffer data into this message.
-
-    When we find a field in |serialized| that is already present
-    in this message:
-      - If it's a "repeated" field, we append to the end of our list.
-      - Else, if it's a scalar, we overwrite our field.
-      - Else, (it's a nonrepeated composite), we recursively merge
-        into the existing composite.
-
-    TODO(robinson): Document handling of unknown fields.
-
-    Args:
-      serialized: Any object that allows us to call buffer(serialized)
-        to access a string of bytes using the buffer interface.
-
-    TODO(robinson): When we switch to a helper, this will return None.
-
-    Returns:
-      The number of bytes read from |serialized|.
-      For non-group messages, this will always be len(serialized),
-      but for messages which are actually groups, this will
-      generally be less than len(serialized), since we must
-      stop when we reach an END_GROUP tag.  Note that if
-      we *do* stop because of an END_GROUP tag, the number
-      of bytes returned does not include the bytes
-      for the END_GROUP tag information.
-    """
-    raise NotImplementedError
-
-  def ParseFromString(self, serialized):
-    """Like MergeFromString(), except we clear the object first."""
-    self.Clear()
-    self.MergeFromString(serialized)
-
-  def SerializeToString(self):
-    """Serializes the protocol message to a binary string.
-
-    Returns:
-      A binary string representation of the message if all of the required
-      fields in the message are set (i.e. the message is initialized).
-
-    Raises:
-      message.EncodeError if the message isn't initialized.
-    """
-    raise NotImplementedError
-
-  def SerializePartialToString(self):
-    """Serializes the protocol message to a binary string.
-
-    This method is similar to SerializeToString but doesn't check if the
-    message is initialized.
-
-    Returns:
-      A string representation of the partial message.
-    """
-    raise NotImplementedError
-
-  # TODO(robinson): Decide whether we like these better
-  # than auto-generated has_foo() and clear_foo() methods
-  # on the instances themselves.  This way is less consistent
-  # with C++, but it makes reflection-type access easier and
-  # reduces the number of magically autogenerated things.
-  #
-  # TODO(robinson): Be sure to document (and test) exactly
-  # which field names are accepted here.  Are we case-sensitive?
-  # What do we do with fields that share names with Python keywords
-  # like 'lambda' and 'yield'?
-  #
-  # nnorwitz says:
-  # """
-  # Typically (in python), an underscore is appended to names that are
-  # keywords. So they would become lambda_ or yield_.
-  # """
-  def ListFields(self, field_name):
-    """Returns a list of (FieldDescriptor, value) tuples for all
-    fields in the message which are not empty.  A singular field is non-empty
-    if HasField() would return true, and a repeated field is non-empty if
-    it contains at least one element.  The fields are ordered by field
-    number"""
-    raise NotImplementedError
-
-  def HasField(self, field_name):
-    raise NotImplementedError
-
-  def ClearField(self, field_name):
-    raise NotImplementedError
-
-  def HasExtension(self, extension_handle):
-    raise NotImplementedError
-
-  def ClearExtension(self, extension_handle):
-    raise NotImplementedError
-
-  def ByteSize(self):
-    """Returns the serialized size of this message.
-    Recursively calls ByteSize() on all contained messages.
-    """
-    raise NotImplementedError
-
-  def _SetListener(self, message_listener):
-    """Internal method used by the protocol message implementation.
-    Clients should not call this directly.
-
-    Sets a listener that this message will call on certain state transitions.
-
-    The purpose of this method is to register back-edges from children to
-    parents at runtime, for the purpose of setting "has" bits and
-    byte-size-dirty bits in the parent and ancestor objects whenever a child or
-    descendant object is modified.
-
-    If the client wants to disconnect this Message from the object tree, she
-    explicitly sets callback to None.
-
-    If message_listener is None, unregisters any existing listener.  Otherwise,
-    message_listener must implement the MessageListener interface in
-    internal/message_listener.py, and we discard any listener registered
-    via a previous _SetListener() call.
-    """
-    raise NotImplementedError
diff --git a/froofle/protobuf/reflection.py b/froofle/protobuf/reflection.py
deleted file mode 100644
index e2abff0..0000000
--- a/froofle/protobuf/reflection.py
+++ /dev/null
@@ -1,1653 +0,0 @@
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# This code is meant to work on Python 2.4 and above only.
-#
-# TODO(robinson): Helpers for verbose, common checks like seeing if a
-# descriptor's cpp_type is CPPTYPE_MESSAGE.
-
-"""Contains a metaclass and helper functions used to create
-protocol message classes from Descriptor objects at runtime.
-
-Recall that a metaclass is the "type" of a class.
-(A class is to a metaclass what an instance is to a class.)
-
-In this case, we use the GeneratedProtocolMessageType metaclass
-to inject all the useful functionality into the classes
-output by the protocol compiler at compile-time.
-
-The upshot of all this is that the real implementation
-details for ALL pure-Python protocol buffers are *here in
-this file*.
-"""
-
-__author__ = 'robinson@google.com (Will Robinson)'
-
-import heapq
-import threading
-import weakref
-# We use "as" to avoid name collisions with variables.
-from froofle.protobuf.internal import decoder
-from froofle.protobuf.internal import encoder
-from froofle.protobuf.internal import message_listener as message_listener_mod
-from froofle.protobuf.internal import type_checkers
-from froofle.protobuf.internal import wire_format
-from froofle.protobuf import descriptor as descriptor_mod
-from froofle.protobuf import message as message_mod
-
-_FieldDescriptor = descriptor_mod.FieldDescriptor
-
-
-class GeneratedProtocolMessageType(type):
-
-  """Metaclass for protocol message classes created at runtime from Descriptors.
-
-  We add implementations for all methods described in the Message class.  We
-  also create properties to allow getting/setting all fields in the protocol
-  message.  Finally, we create slots to prevent users from accidentally
-  "setting" nonexistent fields in the protocol message, which then wouldn't get
-  serialized / deserialized properly.
-
-  The protocol compiler currently uses this metaclass to create protocol
-  message classes at runtime.  Clients can also manually create their own
-  classes at runtime, as in this example:
-
-  mydescriptor = Descriptor(.....)
-  class MyProtoClass(Message):
-    __metaclass__ = GeneratedProtocolMessageType
-    DESCRIPTOR = mydescriptor
-  myproto_instance = MyProtoClass()
-  myproto.foo_field = 23
-  ...
-  """
-
-  # Must be consistent with the protocol-compiler code in
-  # proto2/compiler/internal/generator.*.
-  _DESCRIPTOR_KEY = 'DESCRIPTOR'
-
-  def __new__(cls, name, bases, dictionary):
-    """Custom allocation for runtime-generated class types.
-
-    We override __new__ because this is apparently the only place
-    where we can meaningfully set __slots__ on the class we're creating(?).
-    (The interplay between metaclasses and slots is not very well-documented).
-
-    Args:
-      name: Name of the class (ignored, but required by the
-        metaclass protocol).
-      bases: Base classes of the class we're constructing.
-        (Should be message.Message).  We ignore this field, but
-        it's required by the metaclass protocol
-      dictionary: The class dictionary of the class we're
-        constructing.  dictionary[_DESCRIPTOR_KEY] must contain
-        a Descriptor object describing this protocol message
-        type.
-
-    Returns:
-      Newly-allocated class.
-    """
-    descriptor = dictionary[GeneratedProtocolMessageType._DESCRIPTOR_KEY]
-    _AddSlots(descriptor, dictionary)
-    _AddClassAttributesForNestedExtensions(descriptor, dictionary)
-    superclass = super(GeneratedProtocolMessageType, cls)
-    return superclass.__new__(cls, name, bases, dictionary)
-
-  def __init__(cls, name, bases, dictionary):
-    """Here we perform the majority of our work on the class.
-    We add enum getters, an __init__ method, implementations
-    of all Message methods, and properties for all fields
-    in the protocol type.
-
-    Args:
-      name: Name of the class (ignored, but required by the
-        metaclass protocol).
-      bases: Base classes of the class we're constructing.
-        (Should be message.Message).  We ignore this field, but
-        it's required by the metaclass protocol
-      dictionary: The class dictionary of the class we're
-        constructing.  dictionary[_DESCRIPTOR_KEY] must contain
-        a Descriptor object describing this protocol message
-        type.
-    """
-    descriptor = dictionary[GeneratedProtocolMessageType._DESCRIPTOR_KEY]
-    # We act as a "friend" class of the descriptor, setting
-    # its _concrete_class attribute the first time we use a
-    # given descriptor to initialize a concrete protocol message
-    # class.
-    concrete_class_attr_name = '_concrete_class'
-    if not hasattr(descriptor, concrete_class_attr_name):
-      setattr(descriptor, concrete_class_attr_name, cls)
-    cls._known_extensions = []
-    _AddEnumValues(descriptor, cls)
-    _AddInitMethod(descriptor, cls)
-    _AddPropertiesForFields(descriptor, cls)
-    _AddStaticMethods(cls)
-    _AddMessageMethods(descriptor, cls)
-    _AddPrivateHelperMethods(cls)
-    superclass = super(GeneratedProtocolMessageType, cls)
-    superclass.__init__(cls, name, bases, dictionary)
-
-
-# Stateless helpers for GeneratedProtocolMessageType below.
-# Outside clients should not access these directly.
-#
-# I opted not to make any of these methods on the metaclass, to make it more
-# clear that I'm not really using any state there and to keep clients from
-# thinking that they have direct access to these construction helpers.
-
-
-def _PropertyName(proto_field_name):
-  """Returns the name of the public property attribute which
-  clients can use to get and (in some cases) set the value
-  of a protocol message field.
-
-  Args:
-    proto_field_name: The protocol message field name, exactly
-      as it appears (or would appear) in a .proto file.
-  """
-  # TODO(robinson): Escape Python keywords (e.g., yield), and test this support.
-  # nnorwitz makes my day by writing:
-  # """
-  # FYI.  See the keyword module in the stdlib. This could be as simple as:
-  #
-  # if keyword.iskeyword(proto_field_name):
-  #   return proto_field_name + "_"
-  # return proto_field_name
-  # """
-  return proto_field_name
-
-
-def _ValueFieldName(proto_field_name):
-  """Returns the name of the (internal) instance attribute which objects
-  should use to store the current value for a given protocol message field.
-
-  Args:
-    proto_field_name: The protocol message field name, exactly
-      as it appears (or would appear) in a .proto file.
-  """
-  return '_value_' + proto_field_name
-
-
-def _HasFieldName(proto_field_name):
-  """Returns the name of the (internal) instance attribute which
-  objects should use to store a boolean telling whether this field
-  is explicitly set or not.
-
-  Args:
-    proto_field_name: The protocol message field name, exactly
-      as it appears (or would appear) in a .proto file.
-  """
-  return '_has_' + proto_field_name
-
-
-def _AddSlots(message_descriptor, dictionary):
-  """Adds a __slots__ entry to dictionary, containing the names of all valid
-  attributes for this message type.
-
-  Args:
-    message_descriptor: A Descriptor instance describing this message type.
-    dictionary: Class dictionary to which we'll add a '__slots__' entry.
-  """
-  field_names = [_ValueFieldName(f.name) for f in message_descriptor.fields]
-  field_names.extend(_HasFieldName(f.name) for f in message_descriptor.fields
-                     if f.label != _FieldDescriptor.LABEL_REPEATED)
-  field_names.extend(('Extensions',
-                      '_cached_byte_size',
-                      '_cached_byte_size_dirty',
-                      '_called_transition_to_nonempty',
-                      '_listener',
-                      '_lock', '__weakref__'))
-  dictionary['__slots__'] = field_names
-
-
-def _AddClassAttributesForNestedExtensions(descriptor, dictionary):
-  extension_dict = descriptor.extensions_by_name
-  for extension_name, extension_field in extension_dict.iteritems():
-    assert extension_name not in dictionary
-    dictionary[extension_name] = extension_field
-
-
-def _AddEnumValues(descriptor, cls):
-  """Sets class-level attributes for all enum fields defined in this message.
-
-  Args:
-    descriptor: Descriptor object for this message type.
-    cls: Class we're constructing for this message type.
-  """
-  for enum_type in descriptor.enum_types:
-    for enum_value in enum_type.values:
-      setattr(cls, enum_value.name, enum_value.number)
-
-
-def _DefaultValueForField(message, field):
-  """Returns a default value for a field.
-
-  Args:
-    message: Message instance containing this field, or a weakref proxy
-      of same.
-    field: FieldDescriptor object for this field.
-
-  Returns: A default value for this field.  May refer back to |message|
-    via a weak reference.
-  """
-  # TODO(robinson): Only the repeated fields need a reference to 'message' (so
-  # that they can set the 'has' bit on the containing Message when someone
-  # append()s a value).  We could special-case this, and avoid an extra
-  # function call on __init__() and Clear() for non-repeated fields.
-
-  # TODO(robinson): Find a better place for the default value assertion in this
-  # function.  No need to repeat them every time the client calls Clear('foo').
-  # (We should probably just assert these things once and as early as possible,
-  # by tightening checking in the descriptor classes.)
-  if field.label == _FieldDescriptor.LABEL_REPEATED:
-    if field.default_value != []:
-      raise ValueError('Repeated field default value not empty list: %s' % (
-          field.default_value))
-    listener = _Listener(message, None)
-    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
-      # We can't look at _concrete_class yet since it might not have
-      # been set.  (Depends on order in which we initialize the classes).
-      return _RepeatedCompositeFieldContainer(listener, field.message_type)
-    else:
-      return _RepeatedScalarFieldContainer(
-          listener, type_checkers.GetTypeChecker(field.cpp_type, field.type))
-
-  if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
-    assert field.default_value is None
-
-  return field.default_value
-
-
-def _AddInitMethod(message_descriptor, cls):
-  """Adds an __init__ method to cls."""
-  fields = message_descriptor.fields
-  def init(self):
-    self._cached_byte_size = 0
-    self._cached_byte_size_dirty = False
-    self._listener = message_listener_mod.NullMessageListener()
-    self._called_transition_to_nonempty = False
-    # TODO(robinson): We should only create a lock if we really need one
-    # in this class.
-    self._lock = threading.Lock()
-    for field in fields:
-      default_value = _DefaultValueForField(self, field)
-      python_field_name = _ValueFieldName(field.name)
-      setattr(self, python_field_name, default_value)
-      if field.label != _FieldDescriptor.LABEL_REPEATED:
-        setattr(self, _HasFieldName(field.name), False)
-    self.Extensions = _ExtensionDict(self, cls._known_extensions)
-
-  init.__module__ = None
-  init.__doc__ = None
-  cls.__init__ = init
-
-
-def _AddPropertiesForFields(descriptor, cls):
-  """Adds properties for all fields in this protocol message type."""
-  for field in descriptor.fields:
-    _AddPropertiesForField(field, cls)
-
-
-def _AddPropertiesForField(field, cls):
-  """Adds a public property for a protocol message field.
-  Clients can use this property to get and (in the case
-  of non-repeated scalar fields) directly set the value
-  of a protocol message field.
-
-  Args:
-    field: A FieldDescriptor for this field.
-    cls: The class we're constructing.
-  """
-  # Catch it if we add other types that we should
-  # handle specially here.
-  assert _FieldDescriptor.MAX_CPPTYPE == 10
-
-  if field.label == _FieldDescriptor.LABEL_REPEATED:
-    _AddPropertiesForRepeatedField(field, cls)
-  elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
-    _AddPropertiesForNonRepeatedCompositeField(field, cls)
-  else:
-    _AddPropertiesForNonRepeatedScalarField(field, cls)
-
-
-def _AddPropertiesForRepeatedField(field, cls):
-  """Adds a public property for a "repeated" protocol message field.  Clients
-  can use this property to get the value of the field, which will be either a
-  _RepeatedScalarFieldContainer or _RepeatedCompositeFieldContainer (see
-  below).
-
-  Note that when clients add values to these containers, we perform
-  type-checking in the case of repeated scalar fields, and we also set any
-  necessary "has" bits as a side-effect.
-
-  Args:
-    field: A FieldDescriptor for this field.
-    cls: The class we're constructing.
-  """
-  proto_field_name = field.name
-  python_field_name = _ValueFieldName(proto_field_name)
-  property_name = _PropertyName(proto_field_name)
-
-  def getter(self):
-    return getattr(self, python_field_name)
-  getter.__module__ = None
-  getter.__doc__ = 'Getter for %s.' % proto_field_name
-
-  # We define a setter just so we can throw an exception with a more
-  # helpful error message.
-  def setter(self, new_value):
-    raise AttributeError('Assignment not allowed to repeated field '
-                         '"%s" in protocol message object.' % proto_field_name)
-
-  doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name
-  setattr(cls, property_name, property(getter, setter, doc=doc))
-
-
-def _AddPropertiesForNonRepeatedScalarField(field, cls):
-  """Adds a public property for a nonrepeated, scalar protocol message field.
-  Clients can use this property to get and directly set the value of the field.
-  Note that when the client sets the value of a field by using this property,
-  all necessary "has" bits are set as a side-effect, and we also perform
-  type-checking.
-
-  Args:
-    field: A FieldDescriptor for this field.
-    cls: The class we're constructing.
-  """
-  proto_field_name = field.name
-  python_field_name = _ValueFieldName(proto_field_name)
-  has_field_name = _HasFieldName(proto_field_name)
-  property_name = _PropertyName(proto_field_name)
-  type_checker = type_checkers.GetTypeChecker(field.cpp_type, field.type)
-
-  def getter(self):
-    return getattr(self, python_field_name)
-  getter.__module__ = None
-  getter.__doc__ = 'Getter for %s.' % proto_field_name
-  def setter(self, new_value):
-    type_checker.CheckValue(new_value)
-    setattr(self, has_field_name, True)
-    self._MarkByteSizeDirty()
-    self._MaybeCallTransitionToNonemptyCallback()
-    setattr(self, python_field_name, new_value)
-  setter.__module__ = None
-  setter.__doc__ = 'Setter for %s.' % proto_field_name
-
-  # Add a property to encapsulate the getter/setter.
-  doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name
-  setattr(cls, property_name, property(getter, setter, doc=doc))
-
-
-def _AddPropertiesForNonRepeatedCompositeField(field, cls):
-  """Adds a public property for a nonrepeated, composite protocol message field.
-  A composite field is a "group" or "message" field.
-
-  Clients can use this property to get the value of the field, but cannot
-  assign to the property directly.
-
-  Args:
-    field: A FieldDescriptor for this field.
-    cls: The class we're constructing.
-  """
-  # TODO(robinson): Remove duplication with similar method
-  # for non-repeated scalars.
-  proto_field_name = field.name
-  python_field_name = _ValueFieldName(proto_field_name)
-  has_field_name = _HasFieldName(proto_field_name)
-  property_name = _PropertyName(proto_field_name)
-  message_type = field.message_type
-
-  def getter(self):
-    # TODO(robinson): Appropriately scary note about double-checked locking.
-    field_value = getattr(self, python_field_name)
-    if field_value is None:
-      self._lock.acquire()
-      try:
-        field_value = getattr(self, python_field_name)
-        if field_value is None:
-          field_class = message_type._concrete_class
-          field_value = field_class()
-          field_value._SetListener(_Listener(self, has_field_name))
-          setattr(self, python_field_name, field_value)
-      finally:
-        self._lock.release()
-    return field_value
-  getter.__module__ = None
-  getter.__doc__ = 'Getter for %s.' % proto_field_name
-
-  # We define a setter just so we can throw an exception with a more
-  # helpful error message.
-  def setter(self, new_value):
-    raise AttributeError('Assignment not allowed to composite field '
-                         '"%s" in protocol message object.' % proto_field_name)
-
-  # Add a property to encapsulate the getter.
-  doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name
-  setattr(cls, property_name, property(getter, setter, doc=doc))
-
-
-def _AddStaticMethods(cls):
-  # TODO(robinson): This probably needs to be thread-safe(?)
-  def RegisterExtension(extension_handle):
-    extension_handle.containing_type = cls.DESCRIPTOR
-    cls._known_extensions.append(extension_handle)
-  cls.RegisterExtension = staticmethod(RegisterExtension)
-
-
-def _AddListFieldsMethod(message_descriptor, cls):
-  """Helper for _AddMessageMethods()."""
-
-  # Ensure that we always list in ascending field-number order.
-  # For non-extension fields, we can do the sort once, here, at import-time.
-  # For extensions, we sort on each ListFields() call, though
-  # we could do better if we have to.
-  fields = sorted(message_descriptor.fields, key=lambda f: f.number)
-  has_field_names = (_HasFieldName(f.name) for f in fields)
-  value_field_names = (_ValueFieldName(f.name) for f in fields)
-  triplets = zip(has_field_names, value_field_names, fields)
-
-  def ListFields(self):
-    # We need to list all extension and non-extension fields
-    # together, in sorted order by field number.
-
-    # Step 0: Get an iterator over all "set" non-extension fields,
-    # sorted by field number.
-    # This iterator yields (field_number, field_descriptor, value) tuples.
-    def SortedSetFieldsIter():
-      # Note that triplets is already sorted by field number.
-      for has_field_name, value_field_name, field_descriptor in triplets:
-        if field_descriptor.label == _FieldDescriptor.LABEL_REPEATED:
-          value = getattr(self, _ValueFieldName(field_descriptor.name))
-          if len(value) > 0:
-            yield (field_descriptor.number, field_descriptor, value)
-        elif getattr(self, _HasFieldName(field_descriptor.name)):
-          value = getattr(self, _ValueFieldName(field_descriptor.name))
-          yield (field_descriptor.number, field_descriptor, value)
-    sorted_fields = SortedSetFieldsIter()
-
-    # Step 1: Get an iterator over all "set" extension fields,
-    # sorted by field number.
-    # This iterator ALSO yields (field_number, field_descriptor, value) tuples.
-    # TODO(robinson): It's not necessary to repeat this with each
-    # serialization call.  We can do better.
-    sorted_extension_fields = sorted(
-        [(f.number, f, v) for f, v in self.Extensions._ListSetExtensions()])
-
-    # Step 2: Create a composite iterator that merges the extension-
-    # and non-extension fields, and that still yields fields in
-    # sorted order.
-    all_set_fields = _ImergeSorted(sorted_fields, sorted_extension_fields)
-
-    # Step 3: Strip off the field numbers and return.
-    return [field[1:] for field in all_set_fields]
-
-  cls.ListFields = ListFields
-
-def _AddHasFieldMethod(cls):
-  """Helper for _AddMessageMethods()."""
-  def HasField(self, field_name):
-    try:
-      return getattr(self, _HasFieldName(field_name))
-    except AttributeError:
-      raise ValueError('Protocol message has no "%s" field.' % field_name)
-  cls.HasField = HasField
-
-
-def _AddClearFieldMethod(cls):
-  """Helper for _AddMessageMethods()."""
-  def ClearField(self, field_name):
-    try:
-      field = self.DESCRIPTOR.fields_by_name[field_name]
-    except KeyError:
-      raise ValueError('Protocol message has no "%s" field.' % field_name)
-    proto_field_name = field.name
-    python_field_name = _ValueFieldName(proto_field_name)
-    has_field_name = _HasFieldName(proto_field_name)
-    default_value = _DefaultValueForField(self, field)
-    if field.label == _FieldDescriptor.LABEL_REPEATED:
-      self._MarkByteSizeDirty()
-    else:
-      if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
-        old_field_value = getattr(self, python_field_name)
-        if old_field_value is not None:
-          # Snip the old object out of the object tree.
-          old_field_value._SetListener(None)
-      if getattr(self, has_field_name):
-        setattr(self, has_field_name, False)
-        # Set dirty bit on ourself and parents only if
-        # we're actually changing state.
-        self._MarkByteSizeDirty()
-    setattr(self, python_field_name, default_value)
-  cls.ClearField = ClearField
-
-
-def _AddClearExtensionMethod(cls):
-  """Helper for _AddMessageMethods()."""
-  def ClearExtension(self, extension_handle):
-    self.Extensions._ClearExtension(extension_handle)
-  cls.ClearExtension = ClearExtension
-
-
-def _AddClearMethod(cls):
-  """Helper for _AddMessageMethods()."""
-  def Clear(self):
-    # Clear fields.
-    fields = self.DESCRIPTOR.fields
-    for field in fields:
-      self.ClearField(field.name)
-    # Clear extensions.
-    extensions = self.Extensions._ListSetExtensions()
-    for extension in extensions:
-      self.ClearExtension(extension[0])
-  cls.Clear = Clear
-
-
-def _AddHasExtensionMethod(cls):
-  """Helper for _AddMessageMethods()."""
-  def HasExtension(self, extension_handle):
-    return self.Extensions._HasExtension(extension_handle)
-  cls.HasExtension = HasExtension
-
-
-def _AddEqualsMethod(message_descriptor, cls):
-  """Helper for _AddMessageMethods()."""
-  def __eq__(self, other):
-    if self is other:
-      return True
-
-    # Compare all fields contained directly in this message.
-    for field_descriptor in message_descriptor.fields:
-      label = field_descriptor.label
-      property_name = _PropertyName(field_descriptor.name)
-      # Non-repeated field equality requires matching "has" bits as well
-      # as having an equal value.
-      if label != _FieldDescriptor.LABEL_REPEATED:
-        self_has = self.HasField(property_name)
-        other_has = other.HasField(property_name)
-        if self_has != other_has:
-          return False
-        if not self_has:
-          # If the "has" bit for this field is False, we must stop here.
-          # Otherwise we will recurse forever on recursively-defined protos.
-          continue
-      if getattr(self, property_name) != getattr(other, property_name):
-        return False
-
-    # Compare the extensions present in both messages.
-    return self.Extensions == other.Extensions
-  cls.__eq__ = __eq__
-
-
-def _AddSetListenerMethod(cls):
-  """Helper for _AddMessageMethods()."""
-  def SetListener(self, listener):
-    if listener is None:
-      self._listener = message_listener_mod.NullMessageListener()
-    else:
-      self._listener = listener
-  cls._SetListener = SetListener
-
-
-def _BytesForNonRepeatedElement(value, field_number, field_type):
-  """Returns the number of bytes needed to serialize a non-repeated element.
-  The returned byte count includes space for tag information and any
-  other additional space associated with serializing value.
-
-  Args:
-    value: Value we're serializing.
-    field_number: Field number of this value.  (Since the field number
-      is stored as part of a varint-encoded tag, this has an impact
-      on the total bytes required to serialize the value).
-    field_type: The type of the field.  One of the TYPE_* constants
-      within FieldDescriptor.
-  """
-  try:
-    fn = type_checkers.TYPE_TO_BYTE_SIZE_FN[field_type]
-    return fn(field_number, value)
-  except KeyError:
-    raise message_mod.EncodeError('Unrecognized field type: %d' % field_type)
-
-
-def _AddByteSizeMethod(message_descriptor, cls):
-  """Helper for _AddMessageMethods()."""
-
-  def BytesForField(message, field, value):
-    """Returns the number of bytes required to serialize a single field
-    in message.  The field may be repeated or not, composite or not.
-
-    Args:
-      message: The Message instance containing a field of the given type.
-      field: A FieldDescriptor describing the field of interest.
-      value: The value whose byte size we're interested in.
-
-    Returns: The number of bytes required to serialize the current value
-      of "field" in "message", including space for tags and any other
-      necessary information.
-    """
-
-    if _MessageSetField(field):
-      return wire_format.MessageSetItemByteSize(field.number, value)
-
-    field_number, field_type = field.number, field.type
-
-    # Repeated fields.
-    if field.label == _FieldDescriptor.LABEL_REPEATED:
-      elements = value
-    else:
-      elements = [value]
-
-    size = sum(_BytesForNonRepeatedElement(element, field_number, field_type)
-               for element in elements)
-    return size
-
-  fields = message_descriptor.fields
-  has_field_names = (_HasFieldName(f.name) for f in fields)
-  zipped = zip(has_field_names, fields)
-
-  def ByteSize(self):
-    if not self._cached_byte_size_dirty:
-      return self._cached_byte_size
-
-    size = 0
-    # Hardcoded fields first.
-    for has_field_name, field in zipped:
-      if (field.label == _FieldDescriptor.LABEL_REPEATED
-          or getattr(self, has_field_name)):
-        value = getattr(self, _ValueFieldName(field.name))
-        size += BytesForField(self, field, value)
-    # Extensions next.
-    for field, value in self.Extensions._ListSetExtensions():
-      size += BytesForField(self, field, value)
-
-    self._cached_byte_size = size
-    self._cached_byte_size_dirty = False
-    return size
-  cls.ByteSize = ByteSize
-
-
-def _MessageSetField(field_descriptor):
-  """Checks if a field should be serialized using the message set wire format.
-
-  Args:
-    field_descriptor: Descriptor of the field.
-
-  Returns:
-    True if the field should be serialized using the message set wire format,
-    false otherwise.
-  """
-  return (field_descriptor.is_extension and
-          field_descriptor.label != _FieldDescriptor.LABEL_REPEATED and
-          field_descriptor.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
-          field_descriptor.containing_type.GetOptions().message_set_wire_format)
-
-
-def _SerializeValueToEncoder(value, field_number, field_descriptor, encoder):
-  """Appends the serialization of a single value to encoder.
-
-  Args:
-    value: Value to serialize.
-    field_number: Field number of this value.
-    field_descriptor: Descriptor of the field to serialize.
-    encoder: encoder.Encoder object to which we should serialize this value.
-  """
-  if _MessageSetField(field_descriptor):
-    encoder.AppendMessageSetItem(field_number, value)
-    return
-
-  try:
-    method = type_checkers.TYPE_TO_SERIALIZE_METHOD[field_descriptor.type]
-    method(encoder, field_number, value)
-  except KeyError:
-    raise message_mod.EncodeError('Unrecognized field type: %d' %
-                                  field_descriptor.type)
-
-
-def _ImergeSorted(*streams):
-  """Merges N sorted iterators into a single sorted iterator.
-  Each element in streams must be an iterable that yields
-  its elements in sorted order, and the elements contained
-  in each stream must all be comparable.
-
-  There may be repeated elements in the component streams or
-  across the streams; the repeated elements will all be repeated
-  in the merged iterator as well.
-
-  I believe that the heapq module at HEAD in the Python
-  sources has a method like this, but for now we roll our own.
-  """
-  iters = [iter(stream) for stream in streams]
-  heap = []
-  for index, it in enumerate(iters):
-    try:
-      heap.append((it.next(), index))
-    except StopIteration:
-      pass
-  heapq.heapify(heap)
-
-  while heap:
-    smallest_value, idx = heap[0]
-    yield smallest_value
-    try:
-      next_element = iters[idx].next()
-      heapq.heapreplace(heap, (next_element, idx))
-    except StopIteration:
-      heapq.heappop(heap)
-
-
-def _AddSerializeToStringMethod(message_descriptor, cls):
-  """Helper for _AddMessageMethods()."""
-
-  def SerializeToString(self):
-    # Check if the message has all of its required fields set.
-    errors = []
-    if not _InternalIsInitialized(self, errors):
-      raise message_mod.EncodeError('\n'.join(errors))
-    return self.SerializePartialToString()
-  cls.SerializeToString = SerializeToString
-
-
-def _AddSerializePartialToStringMethod(message_descriptor, cls):
-  """Helper for _AddMessageMethods()."""
-  Encoder = encoder.Encoder
-
-  def SerializePartialToString(self):
-    encoder = Encoder()
-    # We need to serialize all extension and non-extension fields
-    # together, in sorted order by field number.
-    for field_descriptor, field_value in self.ListFields():
-      if field_descriptor.label == _FieldDescriptor.LABEL_REPEATED:
-        repeated_value = field_value
-      else:
-        repeated_value = [field_value]
-      for element in repeated_value:
-        _SerializeValueToEncoder(element, field_descriptor.number,
-                                 field_descriptor, encoder)
-    return encoder.ToString()
-  cls.SerializePartialToString = SerializePartialToString
-
-
-def _WireTypeForFieldType(field_type):
-  """Given a field type, returns the expected wire type."""
-  try:
-    return type_checkers.FIELD_TYPE_TO_WIRE_TYPE[field_type]
-  except KeyError:
-    raise message_mod.DecodeError('Unknown field type: %d' % field_type)
-
-
-def _RecursivelyMerge(field_number, field_type, decoder, message):
-  """Decodes a message from decoder into message.
-  message is either a group or a nested message within some containing
-  protocol message.  If it's a group, we use the group protocol to
-  deserialize, and if it's a nested message, we use the nested-message
-  protocol.
-
-  Args:
-    field_number: The field number of message in its enclosing protocol buffer.
-    field_type: The field type of message.  Must be either TYPE_MESSAGE
-      or TYPE_GROUP.
-    decoder: Decoder to read from.
-    message: Message to deserialize into.
-  """
-  if field_type == _FieldDescriptor.TYPE_MESSAGE:
-    decoder.ReadMessageInto(message)
-  elif field_type == _FieldDescriptor.TYPE_GROUP:
-    decoder.ReadGroupInto(field_number, message)
-  else:
-    raise message_mod.DecodeError('Unexpected field type: %d' % field_type)
-
-
-def _DeserializeScalarFromDecoder(field_type, decoder):
-  """Deserializes a scalar of the requested type from decoder.  field_type must
-  be a scalar (non-group, non-message) FieldDescriptor.FIELD_* constant.
-  """
-  try:
-    method = type_checkers.TYPE_TO_DESERIALIZE_METHOD[field_type]
-    return method(decoder)
-  except KeyError:
-    raise message_mod.DecodeError('Unrecognized field type: %d' % field_type)
-
-
-def _SkipField(field_number, wire_type, decoder):
-  """Skips a field with the specified wire type.
-
-  Args:
-    field_number: Tag number of the field to skip.
-    wire_type: Wire type of the field to skip.
-    decoder: Decoder used to deserialize the messsage. It must be positioned
-      just after reading the the tag and wire type of the field.
-  """
-  if wire_type == wire_format.WIRETYPE_VARINT:
-    decoder.ReadUInt64()
-  elif wire_type == wire_format.WIRETYPE_FIXED64:
-    decoder.ReadFixed64()
-  elif wire_type == wire_format.WIRETYPE_LENGTH_DELIMITED:
-    decoder.SkipBytes(decoder.ReadInt32())
-  elif wire_type == wire_format.WIRETYPE_START_GROUP:
-    _SkipGroup(field_number, decoder)
-  elif wire_type == wire_format.WIRETYPE_END_GROUP:
-    pass
-  elif wire_type == wire_format.WIRETYPE_FIXED32:
-    decoder.ReadFixed32()
-  else:
-    raise message_mod.DecodeError('Unexpected wire type: %d' % wire_type)
-
-
-def _SkipGroup(group_number, decoder):
-  """Skips a nested group from the decoder.
-
-  Args:
-    group_number: Tag number of the group to skip.
-    decoder: Decoder used to deserialize the message. It must be positioned
-      exactly at the beginning of the message that should be skipped.
-  """
-  while True:
-    field_number, wire_type = decoder.ReadFieldNumberAndWireType()
-    if (wire_type == wire_format.WIRETYPE_END_GROUP and
-        field_number == group_number):
-      return
-    _SkipField(field_number, wire_type, decoder)
-
-
-def _DeserializeMessageSetItem(message, decoder):
-  """Deserializes a message using the message set wire format.
-
-  Args:
-    message: Message to be parsed to.
-    decoder: The decoder to be used to deserialize encoded data. Note that the
-      decoder should be positioned just after reading the START_GROUP tag that
-      began the messageset item.
-  """
-  field_number, wire_type = decoder.ReadFieldNumberAndWireType()
-  if wire_type != wire_format.WIRETYPE_VARINT or field_number != 2:
-    raise message_mod.DecodeError(
-        'Incorrect message set wire format. '
-        'wire_type: %d, field_number: %d' % (wire_type, field_number))
-
-  type_id = decoder.ReadInt32()
-  field_number, wire_type = decoder.ReadFieldNumberAndWireType()
-  if wire_type != wire_format.WIRETYPE_LENGTH_DELIMITED or field_number != 3:
-    raise message_mod.DecodeError(
-        'Incorrect message set wire format. '
-        'wire_type: %d, field_number: %d' % (wire_type, field_number))
-
-  extension_dict = message.Extensions
-  extensions_by_number = extension_dict._AllExtensionsByNumber()
-  if type_id not in extensions_by_number:
-    _SkipField(field_number, wire_type, decoder)
-    return
-
-  field_descriptor = extensions_by_number[type_id]
-  value = extension_dict[field_descriptor]
-  decoder.ReadMessageInto(value)
-  # Read the END_GROUP tag.
-  field_number, wire_type = decoder.ReadFieldNumberAndWireType()
-  if wire_type != wire_format.WIRETYPE_END_GROUP or field_number != 1:
-    raise message_mod.DecodeError(
-        'Incorrect message set wire format. '
-        'wire_type: %d, field_number: %d' % (wire_type, field_number))
-
-
-def _DeserializeOneEntity(message_descriptor, message, decoder):
-  """Deserializes the next wire entity from decoder into message.
-  The next wire entity is either a scalar or a nested message,
-  and may also be an element in a repeated field (the wire encoding
-  is the same).
-
-  Args:
-    message_descriptor: A Descriptor instance describing all fields
-      in message.
-    message: The Message instance into which we're decoding our fields.
-    decoder: The Decoder we're using to deserialize encoded data.
-
-  Returns: The number of bytes read from decoder during this method.
-  """
-  initial_position = decoder.Position()
-  field_number, wire_type = decoder.ReadFieldNumberAndWireType()
-  extension_dict = message.Extensions
-  extensions_by_number = extension_dict._AllExtensionsByNumber()
-  if field_number in message_descriptor.fields_by_number:
-    # Non-extension field.
-    field_descriptor = message_descriptor.fields_by_number[field_number]
-    value = getattr(message, _PropertyName(field_descriptor.name))
-    def nonextension_setter_fn(scalar):
-      setattr(message, _PropertyName(field_descriptor.name), scalar)
-    scalar_setter_fn = nonextension_setter_fn
-  elif field_number in extensions_by_number:
-    # Extension field.
-    field_descriptor = extensions_by_number[field_number]
-    value = extension_dict[field_descriptor]
-    def extension_setter_fn(scalar):
-      extension_dict[field_descriptor] = scalar
-    scalar_setter_fn = extension_setter_fn
-  elif wire_type == wire_format.WIRETYPE_END_GROUP:
-    # We assume we're being parsed as the group that's ended.
-    return 0
-  elif (wire_type == wire_format.WIRETYPE_START_GROUP and
-        field_number == 1 and
-        message_descriptor.GetOptions().message_set_wire_format):
-    # A Message Set item.
-    _DeserializeMessageSetItem(message, decoder)
-    return decoder.Position() - initial_position
-  else:
-    _SkipField(field_number, wire_type, decoder)
-    return decoder.Position() - initial_position
-
-  # If we reach this point, we've identified the field as either
-  # hardcoded or extension, and set |field_descriptor|, |scalar_setter_fn|,
-  # and |value| appropriately.  Now actually deserialize the thing.
-  #
-  # field_descriptor: Describes the field we're deserializing.
-  # value: The value currently stored in the field to deserialize.
-  #   Used only if the field is composite and/or repeated.
-  # scalar_setter_fn: A function F such that F(scalar) will
-  #   set a nonrepeated scalar value for this field.  Used only
-  #   if this field is a nonrepeated scalar.
-
-  field_number = field_descriptor.number
-  field_type = field_descriptor.type
-  expected_wire_type = _WireTypeForFieldType(field_type)
-  if wire_type != expected_wire_type:
-    # Need to fill in uninterpreted_bytes.  Work for the next CL.
-    raise RuntimeError('TODO(robinson): Wiretype mismatches not handled.')
-
-  property_name = _PropertyName(field_descriptor.name)
-  label = field_descriptor.label
-  cpp_type = field_descriptor.cpp_type
-
-  # Nonrepeated scalar.  Just set the field directly.
-  if (label != _FieldDescriptor.LABEL_REPEATED
-      and cpp_type != _FieldDescriptor.CPPTYPE_MESSAGE):
-    scalar_setter_fn(_DeserializeScalarFromDecoder(field_type, decoder))
-    return decoder.Position() - initial_position
-
-  # Nonrepeated composite.  Recursively deserialize.
-  if label != _FieldDescriptor.LABEL_REPEATED:
-    composite = value
-    _RecursivelyMerge(field_number, field_type, decoder, composite)
-    return decoder.Position() - initial_position
-
-  # Now we know we're dealing with a repeated field of some kind.
-  element_list = value
-
-  if cpp_type != _FieldDescriptor.CPPTYPE_MESSAGE:
-    # Repeated scalar.
-    element_list.append(_DeserializeScalarFromDecoder(field_type, decoder))
-    return decoder.Position() - initial_position
-  else:
-    # Repeated composite.
-    composite = element_list.add()
-    _RecursivelyMerge(field_number, field_type, decoder, composite)
-    return decoder.Position() - initial_position
-
-
-def _FieldOrExtensionValues(message, field_or_extension):
-  """Retrieves the list of values for the specified field or extension.
-
-  The target field or extension can be optional, required or repeated, but it
-  must have value(s) set. The assumption is that the target field or extension
-  is set (e.g. _HasFieldOrExtension holds true).
-
-  Args:
-    message: Message which contains the target field or extension.
-    field_or_extension: Field or extension for which the list of values is
-      required. Must be an instance of FieldDescriptor.
-
-  Returns:
-    A list of values for the specified field or extension. This list will only
-    contain a single element if the field is non-repeated.
-  """
-  if field_or_extension.is_extension:
-    value = message.Extensions[field_or_extension]
-  else:
-    value = getattr(message, _ValueFieldName(field_or_extension.name))
-  if field_or_extension.label != _FieldDescriptor.LABEL_REPEATED:
-    return [value]
-  else:
-    # In this case value is a list or repeated values.
-    return value
-
-
-def _HasFieldOrExtension(message, field_or_extension):
-  """Checks if a message has the specified field or extension set.
-
-  The field or extension specified can be optional, required or repeated. If
-  it is repeated, this function returns True. Otherwise it checks the has bit
-  of the field or extension.
-
-  Args:
-    message: Message which contains the target field or extension.
-    field_or_extension: Field or extension to check. This must be a
-      FieldDescriptor instance.
-
-  Returns:
-    True if the message has a value set for the specified field or extension,
-    or if the field or extension is repeated.
-  """
-  if field_or_extension.label == _FieldDescriptor.LABEL_REPEATED:
-    return True
-  if field_or_extension.is_extension:
-    return message.HasExtension(field_or_extension)
-  else:
-    return message.HasField(field_or_extension.name)
-
-
-def _IsFieldOrExtensionInitialized(message, field, errors=None):
-  """Checks if a message field or extension is initialized.
-
-  Args:
-    message: The message which contains the field or extension.
-    field: Field or extension to check. This must be a FieldDescriptor instance.
-    errors: Errors will be appended to it, if set to a meaningful value.
-
-  Returns:
-    True if the field/extension can be considered initialized.
-  """
-  # If the field is required and is not set, it isn't initialized.
-  if field.label == _FieldDescriptor.LABEL_REQUIRED:
-    if not _HasFieldOrExtension(message, field):
-      if errors is not None:
-        errors.append('Required field %s is not set.' % field.full_name)
-      return False
-
-  # If the field is optional and is not set, or if it
-  # isn't a submessage then the field is initialized.
-  if field.label == _FieldDescriptor.LABEL_OPTIONAL:
-    if not _HasFieldOrExtension(message, field):
-      return True
-  if field.cpp_type != _FieldDescriptor.CPPTYPE_MESSAGE:
-    return True
-
-  # The field is set and is either a single or a repeated submessage.
-  messages = _FieldOrExtensionValues(message, field)
-  # If all submessages in this field are initialized, the field is
-  # considered initialized.
-  for message in messages:
-    if not _InternalIsInitialized(message, errors):
-      return False
-  return True
-
-
-def _InternalIsInitialized(message, errors=None):
-  """Checks if all required fields of a message are set.
-
-  Args:
-    message: The message to check.
-    errors: If set, initialization errors will be appended to it.
-
-  Returns:
-    True iff the specified message has all required fields set.
-  """
-  fields_and_extensions = []
-  fields_and_extensions.extend(message.DESCRIPTOR.fields)
-  fields_and_extensions.extend(
-      [extension[0] for extension in message.Extensions._ListSetExtensions()])
-  for field_or_extension in fields_and_extensions:
-    if not _IsFieldOrExtensionInitialized(message, field_or_extension, errors):
-      return False
-  return True
-
-
-def _AddMergeFromStringMethod(message_descriptor, cls):
-  """Helper for _AddMessageMethods()."""
-  Decoder = decoder.Decoder
-  def MergeFromString(self, serialized):
-    decoder = Decoder(serialized)
-    byte_count = 0
-    while not decoder.EndOfStream():
-      bytes_read = _DeserializeOneEntity(message_descriptor, self, decoder)
-      if not bytes_read:
-        break
-      byte_count += bytes_read
-    return byte_count
-  cls.MergeFromString = MergeFromString
-
-
-def _AddIsInitializedMethod(cls):
-  """Adds the IsInitialized method to the protocol message class."""
-  cls.IsInitialized = _InternalIsInitialized
-
-
-def _MergeFieldOrExtension(destination_msg, field, value):
-  """Merges a specified message field into another message."""
-  property_name = _PropertyName(field.name)
-  is_extension = field.is_extension
-
-  if not is_extension:
-    destination = getattr(destination_msg, property_name)
-  elif (field.label == _FieldDescriptor.LABEL_REPEATED or
-        field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE):
-    destination = destination_msg.Extensions[field]
-
-  # Case 1 - a composite field.
-  if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
-    if field.label == _FieldDescriptor.LABEL_REPEATED:
-      for v in value:
-        destination.add().MergeFrom(v)
-    else:
-      destination.MergeFrom(value)
-    return
-
-  # Case 2 - a repeated field.
-  if field.label == _FieldDescriptor.LABEL_REPEATED:
-    for v in value:
-      destination.append(v)
-    return
-
-  # Case 3 - a singular field.
-  if is_extension:
-    destination_msg.Extensions[field] = value
-  else:
-    setattr(destination_msg, property_name, value)
-
-
-def _AddMergeFromMethod(cls):
-  def MergeFrom(self, msg):
-    assert msg is not self
-    for field in msg.ListFields():
-      _MergeFieldOrExtension(self, field[0], field[1])
-  cls.MergeFrom = MergeFrom
-
-
-def _AddMessageMethods(message_descriptor, cls):
-  """Adds implementations of all Message methods to cls."""
-  _AddListFieldsMethod(message_descriptor, cls)
-  _AddHasFieldMethod(cls)
-  _AddClearFieldMethod(cls)
-  _AddClearExtensionMethod(cls)
-  _AddClearMethod(cls)
-  _AddHasExtensionMethod(cls)
-  _AddEqualsMethod(message_descriptor, cls)
-  _AddSetListenerMethod(cls)
-  _AddByteSizeMethod(message_descriptor, cls)
-  _AddSerializeToStringMethod(message_descriptor, cls)
-  _AddSerializePartialToStringMethod(message_descriptor, cls)
-  _AddMergeFromStringMethod(message_descriptor, cls)
-  _AddIsInitializedMethod(cls)
-  _AddMergeFromMethod(cls)
-
-
-def _AddPrivateHelperMethods(cls):
-  """Adds implementation of private helper methods to cls."""
-
-  def MaybeCallTransitionToNonemptyCallback(self):
-    """Calls self._listener.TransitionToNonempty() the first time this
-    method is called.  On all subsequent calls, this is a no-op.
-    """
-    if not self._called_transition_to_nonempty:
-      self._listener.TransitionToNonempty()
-      self._called_transition_to_nonempty = True
-  cls._MaybeCallTransitionToNonemptyCallback = (
-      MaybeCallTransitionToNonemptyCallback)
-
-  def MarkByteSizeDirty(self):
-    """Sets the _cached_byte_size_dirty bit to true,
-    and propagates this to our listener iff this was a state change.
-    """
-    if not self._cached_byte_size_dirty:
-      self._cached_byte_size_dirty = True
-      self._listener.ByteSizeDirty()
-  cls._MarkByteSizeDirty = MarkByteSizeDirty
-
-
-class _Listener(object):
-
-  """MessageListener implementation that a parent message registers with its
-  child message.
-
-  In order to support semantics like:
-
-    foo.bar.baz = 23
-    assert foo.HasField('bar')
-
-  ...child objects must have back references to their parents.
-  This helper class is at the heart of this support.
-  """
-
-  def __init__(self, parent_message, has_field_name):
-    """Args:
-      parent_message: The message whose _MaybeCallTransitionToNonemptyCallback()
-        and _MarkByteSizeDirty() methods we should call when we receive
-        TransitionToNonempty() and ByteSizeDirty() messages.
-      has_field_name: The name of the "has" field that we should set in
-        the parent message when we receive a TransitionToNonempty message,
-        or None if there's no "has" field to set.  (This will be the case
-        for child objects in "repeated" fields).
-    """
-    # This listener establishes a back reference from a child (contained) object
-    # to its parent (containing) object.  We make this a weak reference to avoid
-    # creating cyclic garbage when the client finishes with the 'parent' object
-    # in the tree.
-    if isinstance(parent_message, weakref.ProxyType):
-      self._parent_message_weakref = parent_message
-    else:
-      self._parent_message_weakref = weakref.proxy(parent_message)
-    self._has_field_name = has_field_name
-
-  def TransitionToNonempty(self):
-    try:
-      if self._has_field_name is not None:
-        setattr(self._parent_message_weakref, self._has_field_name, True)
-      # Propagate the signal to our parents iff this is the first field set.
-      self._parent_message_weakref._MaybeCallTransitionToNonemptyCallback()
-    except ReferenceError:
-      # We can get here if a client has kept a reference to a child object,
-      # and is now setting a field on it, but the child's parent has been
-      # garbage-collected.  This is not an error.
-      pass
-
-  def ByteSizeDirty(self):
-    try:
-      self._parent_message_weakref._MarkByteSizeDirty()
-    except ReferenceError:
-      # Same as above.
-      pass
-
-
-# TODO(robinson): Move elsewhere?
-# TODO(robinson): Provide a clear() method here in addition to ClearField()?
-class _RepeatedScalarFieldContainer(object):
-
-  """Simple, type-checked, list-like container for holding repeated scalars."""
-
-  # Minimizes memory usage and disallows assignment to other attributes.
-  __slots__ = ['_message_listener', '_type_checker', '_values']
-
-  def __init__(self, message_listener, type_checker):
-    """
-    Args:
-      message_listener: A MessageListener implementation.
-        The _RepeatedScalarFieldContaininer will call this object's
-        TransitionToNonempty() method when it transitions from being empty to
-        being nonempty.
-      type_checker: A _ValueChecker instance to run on elements inserted
-        into this container.
-    """
-    self._message_listener = message_listener
-    self._type_checker = type_checker
-    self._values = []
-
-  def append(self, elem):
-    self._type_checker.CheckValue(elem)
-    self._values.append(elem)
-    self._message_listener.ByteSizeDirty()
-    if len(self._values) == 1:
-      self._message_listener.TransitionToNonempty()
-
-  def remove(self, elem):
-    self._values.remove(elem)
-    self._message_listener.ByteSizeDirty()
-
-  # List-like __getitem__() support also makes us iterable (via "iter(foo)"
-  # or implicitly via "for i in mylist:") for free.
-  def __getitem__(self, key):
-    return self._values[key]
-
-  def __setitem__(self, key, value):
-    # No need to call TransitionToNonempty(), since if we're able to
-    # set the element at this index, we were already nonempty before
-    # this method was called.
-    self._message_listener.ByteSizeDirty()
-    self._type_checker.CheckValue(value)
-    self._values[key] = value
-
-  def __len__(self):
-    return len(self._values)
-
-  def __eq__(self, other):
-    if self is other:
-      return True
-    # Special case for the same type which should be common and fast.
-    if isinstance(other, self.__class__):
-      return other._values == self._values
-    # We are presumably comparing against some other sequence type.
-    return other == self._values
-
-  def __ne__(self, other):
-    # Can't use != here since it would infinitely recurse.
-    return not self == other
-
-
-# TODO(robinson): Move elsewhere?
-# TODO(robinson): Provide a clear() method here in addition to ClearField()?
-# TODO(robinson): Unify common functionality with
-# _RepeatedScalarFieldContaininer?
-class _RepeatedCompositeFieldContainer(object):
-
-  """Simple, list-like container for holding repeated composite fields."""
-
-  # Minimizes memory usage and disallows assignment to other attributes.
-  __slots__ = ['_values', '_message_descriptor', '_message_listener']
-
-  def __init__(self, message_listener, message_descriptor):
-    """Note that we pass in a descriptor instead of the generated directly,
-    since at the time we construct a _RepeatedCompositeFieldContainer we
-    haven't yet necessarily initialized the type that will be contained in the
-    container.
-
-    Args:
-      message_listener: A MessageListener implementation.
-        The _RepeatedCompositeFieldContainer will call this object's
-        TransitionToNonempty() method when it transitions from being empty to
-        being nonempty.
-      message_descriptor: A Descriptor instance describing the protocol type
-        that should be present in this container.  We'll use the
-        _concrete_class field of this descriptor when the client calls add().
-    """
-    self._message_listener = message_listener
-    self._message_descriptor = message_descriptor
-    self._values = []
-
-  def add(self):
-    new_element = self._message_descriptor._concrete_class()
-    new_element._SetListener(self._message_listener)
-    self._values.append(new_element)
-    self._message_listener.ByteSizeDirty()
-    self._message_listener.TransitionToNonempty()
-    return new_element
-
-  def __delitem__(self, key):
-    self._message_listener.ByteSizeDirty()
-    del self._values[key]
-
-  # List-like __getitem__() support also makes us iterable (via "iter(foo)"
-  # or implicitly via "for i in mylist:") for free.
-  def __getitem__(self, key):
-    return self._values[key]
-
-  def __len__(self):
-    return len(self._values)
-
-  def __eq__(self, other):
-    if self is other:
-      return True
-    if not isinstance(other, self.__class__):
-      raise TypeError('Can only compare repeated composite fields against '
-                      'other repeated composite fields.')
-    return self._values == other._values
-
-  def __ne__(self, other):
-    # Can't use != here since it would infinitely recurse.
-    return not self == other
-
-  # TODO(robinson): Implement, document, and test slicing support.
-
-
-# TODO(robinson): Move elsewhere?  This file is getting pretty ridiculous...
-# TODO(robinson): Unify error handling of "unknown extension" crap.
-# TODO(robinson): There's so much similarity between the way that
-# extensions behave and the way that normal fields behave that it would
-# be really nice to unify more code.  It's not immediately obvious
-# how to do this, though, and I'd rather get the full functionality
-# implemented (and, crucially, get all the tests and specs fleshed out
-# and passing), and then come back to this thorny unification problem.
-# TODO(robinson): Support iteritems()-style iteration over all
-# extensions with the "has" bits turned on?
-class _ExtensionDict(object):
-
-  """Dict-like container for supporting an indexable "Extensions"
-  field on proto instances.
-
-  Note that in all cases we expect extension handles to be
-  FieldDescriptors.
-  """
-
-  class _ExtensionListener(object):
-
-    """Adapts an _ExtensionDict to behave as a MessageListener."""
-
-    def __init__(self, extension_dict, handle_id):
-      self._extension_dict = extension_dict
-      self._handle_id = handle_id
-
-    def TransitionToNonempty(self):
-      self._extension_dict._SubmessageTransitionedToNonempty(self._handle_id)
-
-    def ByteSizeDirty(self):
-      self._extension_dict._SubmessageByteSizeBecameDirty()
-
-  # TODO(robinson): Somewhere, we need to blow up if people
-  # try to register two extensions with the same field number.
-  # (And we need a test for this of course).
-
-  def __init__(self, extended_message, known_extensions):
-    """extended_message: Message instance for which we are the Extensions dict.
-      known_extensions: Iterable of known extension handles.
-        These must be FieldDescriptors.
-    """
-    # We keep a weak reference to extended_message, since
-    # it has a reference to this instance in turn.
-    self._extended_message = weakref.proxy(extended_message)
-    # We make a deep copy of known_extensions to avoid any
-    # thread-safety concerns, since the argument passed in
-    # is the global (class-level) dict of known extensions for
-    # this type of message, which could be modified at any time
-    # via a RegisterExtension() call.
-    #
-    # This dict maps from handle id to handle (a FieldDescriptor).
-    #
-    # XXX
-    # TODO(robinson): This isn't good enough.  The client could
-    # instantiate an object in module A, then afterward import
-    # module B and pass the instance to B.Foo().  If B imports
-    # an extender of this proto and then tries to use it, B
-    # will get a KeyError, even though the extension *is* registered
-    # at the time of use.
-    # XXX
-    self._known_extensions = dict((id(e), e) for e in known_extensions)
-    # Read lock around self._values, which may be modified by multiple
-    # concurrent readers in the conceptually "const" __getitem__ method.
-    # So, we grab this lock in every "read-only" method to ensure
-    # that concurrent read access is safe without external locking.
-    self._lock = threading.Lock()
-    # Maps from extension handle ID to current value of that extension.
-    self._values = {}
-    # Maps from extension handle ID to a boolean "has" bit, but only
-    # for non-repeated extension fields.
-    keys = (id for id, extension in self._known_extensions.iteritems()
-            if extension.label != _FieldDescriptor.LABEL_REPEATED)
-    self._has_bits = dict.fromkeys(keys, False)
-
-  def __getitem__(self, extension_handle):
-    """Returns the current value of the given extension handle."""
-    # We don't care as much about keeping critical sections short in the
-    # extension support, since it's presumably much less of a common case.
-    self._lock.acquire()
-    try:
-      handle_id = id(extension_handle)
-      if handle_id not in self._known_extensions:
-        raise KeyError('Extension not known to this class')
-      if handle_id not in self._values:
-        self._AddMissingHandle(extension_handle, handle_id)
-      return self._values[handle_id]
-    finally:
-      self._lock.release()
-
-  def __eq__(self, other):
-    # We have to grab read locks since we're accessing _values
-    # in a "const" method.  See the comment in the constructor.
-    if self is other:
-      return True
-    self._lock.acquire()
-    try:
-      other._lock.acquire()
-      try:
-        if self._has_bits != other._has_bits:
-          return False
-        # If there's a "has" bit, then only compare values where it is true.
-        for k, v in self._values.iteritems():
-          if self._has_bits.get(k, False) and v != other._values[k]:
-            return False
-        return True
-      finally:
-        other._lock.release()
-    finally:
-      self._lock.release()
-
-  def __ne__(self, other):
-    return not self == other
-
-  # Note that this is only meaningful for non-repeated, scalar extension
-  # fields.  Note also that we may have to call
-  # MaybeCallTransitionToNonemptyCallback() when we do successfully set a field
-  # this way, to set any necssary "has" bits in the ancestors of the extended
-  # message.
-  def __setitem__(self, extension_handle, value):
-    """If extension_handle specifies a non-repeated, scalar extension
-    field, sets the value of that field.
-    """
-    handle_id = id(extension_handle)
-    if handle_id not in self._known_extensions:
-      raise KeyError('Extension not known to this class')
-    field = extension_handle  # Just shorten the name.
-    if (field.label == _FieldDescriptor.LABEL_OPTIONAL
-        and field.cpp_type != _FieldDescriptor.CPPTYPE_MESSAGE):
-      # It's slightly wasteful to lookup the type checker each time,
-      # but we expect this to be a vanishingly uncommon case anyway.
-      type_checker = type_checkers.GetTypeChecker(field.cpp_type, field.type)
-      type_checker.CheckValue(value)
-      self._values[handle_id] = value
-      self._has_bits[handle_id] = True
-      self._extended_message._MarkByteSizeDirty()
-      self._extended_message._MaybeCallTransitionToNonemptyCallback()
-    else:
-      raise TypeError('Extension is repeated and/or a composite type.')
-
-  def _AddMissingHandle(self, extension_handle, handle_id):
-    """Helper internal to ExtensionDict."""
-    # Special handling for non-repeated message extensions, which (like
-    # normal fields of this kind) are initialized lazily.
-    # REQUIRES: _lock already held.
-    cpp_type = extension_handle.cpp_type
-    label = extension_handle.label
-    if (cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE
-        and label != _FieldDescriptor.LABEL_REPEATED):
-      self._AddMissingNonRepeatedCompositeHandle(extension_handle, handle_id)
-    else:
-      self._values[handle_id] = _DefaultValueForField(
-          self._extended_message, extension_handle)
-
-  def _AddMissingNonRepeatedCompositeHandle(self, extension_handle, handle_id):
-    """Helper internal to ExtensionDict."""
-    # REQUIRES: _lock already held.
-    value = extension_handle.message_type._concrete_class()
-    value._SetListener(_ExtensionDict._ExtensionListener(self, handle_id))
-    self._values[handle_id] = value
-
-  def _SubmessageTransitionedToNonempty(self, handle_id):
-    """Called when a submessage with a given handle id first transitions to
-    being nonempty.  Called by _ExtensionListener.
-    """
-    assert handle_id in self._has_bits
-    self._has_bits[handle_id] = True
-    self._extended_message._MaybeCallTransitionToNonemptyCallback()
-
-  def _SubmessageByteSizeBecameDirty(self):
-    """Called whenever a submessage's cached byte size becomes invalid
-    (goes from being "clean" to being "dirty").  Called by _ExtensionListener.
-    """
-    self._extended_message._MarkByteSizeDirty()
-
-  # We may wish to widen the public interface of Message.Extensions
-  # to expose some of this private functionality in the future.
-  # For now, we make all this functionality module-private and just
-  # implement what we need for serialization/deserialization,
-  # HasField()/ClearField(), etc.
-
-  def _HasExtension(self, extension_handle):
-    """Method for internal use by this module.
-    Returns true iff we "have" this extension in the sense of the
-    "has" bit being set.
-    """
-    handle_id = id(extension_handle)
-    # Note that this is different from the other checks.
-    if handle_id not in self._has_bits:
-      raise KeyError('Extension not known to this class, or is repeated field.')
-    return self._has_bits[handle_id]
-
-  # Intentionally pretty similar to ClearField() above.
-  def _ClearExtension(self, extension_handle):
-    """Method for internal use by this module.
-    Clears the specified extension, unsetting its "has" bit.
-    """
-    handle_id = id(extension_handle)
-    if handle_id not in self._known_extensions:
-      raise KeyError('Extension not known to this class')
-    default_value = _DefaultValueForField(self._extended_message,
-                                          extension_handle)
-    if extension_handle.label == _FieldDescriptor.LABEL_REPEATED:
-      self._extended_message._MarkByteSizeDirty()
-    else:
-      cpp_type = extension_handle.cpp_type
-      if cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
-        if handle_id in self._values:
-          # Future modifications to this object shouldn't set any
-          # "has" bits here.
-          self._values[handle_id]._SetListener(None)
-      if self._has_bits[handle_id]:
-        self._has_bits[handle_id] = False
-        self._extended_message._MarkByteSizeDirty()
-    if handle_id in self._values:
-      del self._values[handle_id]
-
-  def _ListSetExtensions(self):
-    """Method for internal use by this module.
-
-    Returns an sequence of all extensions that are currently "set"
-    in this extension dict.  A "set" extension is a repeated extension,
-    or a non-repeated extension with its "has" bit set.
-
-    The returned sequence contains (field_descriptor, value) pairs,
-    where value is the current value of the extension with the given
-    field descriptor.
-
-    The sequence values are in arbitrary order.
-    """
-    self._lock.acquire()  # Read-only methods must lock around self._values.
-    try:
-      set_extensions = []
-      for handle_id, value in self._values.iteritems():
-        handle = self._known_extensions[handle_id]
-        if (handle.label == _FieldDescriptor.LABEL_REPEATED
-            or self._has_bits[handle_id]):
-          set_extensions.append((handle, value))
-      return set_extensions
-    finally:
-      self._lock.release()
-
-  def _AllExtensionsByNumber(self):
-    """Method for internal use by this module.
-
-    Returns: A dict mapping field_number to (handle, field_descriptor),
-      for *all* registered extensions for this dict.
-    """
-    # TODO(robinson): Precompute and store this away.  Note that we'll have to
-    # be careful when we move away from having _known_extensions as a
-    # deep-copied member of this object.
-    return dict((f.number, f) for f in self._known_extensions.itervalues())
diff --git a/froofle/protobuf/service.py b/froofle/protobuf/service.py
deleted file mode 100644
index 3989216..0000000
--- a/froofle/protobuf/service.py
+++ /dev/null
@@ -1,208 +0,0 @@
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""Declares the RPC service interfaces.
-
-This module declares the abstract interfaces underlying proto2 RPC
-services.  These are intented to be independent of any particular RPC
-implementation, so that proto2 services can be used on top of a variety
-of implementations.
-"""
-
-__author__ = 'petar@google.com (Petar Petrov)'
-
-
-class Service(object):
-
-  """Abstract base interface for protocol-buffer-based RPC services.
-
-  Services themselves are abstract classes (implemented either by servers or as
-  stubs), but they subclass this base interface. The methods of this
-  interface can be used to call the methods of the service without knowing
-  its exact type at compile time (analogous to the Message interface).
-  """
-
-  def GetDescriptor(self):
-    """Retrieves this service's descriptor."""
-    raise NotImplementedError
-
-  def CallMethod(self, method_descriptor, rpc_controller,
-                 request, done):
-    """Calls a method of the service specified by method_descriptor.
-
-    Preconditions:
-    * method_descriptor.service == GetDescriptor
-    * request is of the exact same classes as returned by
-      GetRequestClass(method).
-    * After the call has started, the request must not be modified.
-    * "rpc_controller" is of the correct type for the RPC implementation being
-      used by this Service.  For stubs, the "correct type" depends on the
-      RpcChannel which the stub is using.
-
-    Postconditions:
-    * "done" will be called when the method is complete.  This may be
-      before CallMethod() returns or it may be at some point in the future.
-    """
-    raise NotImplementedError
-
-  def GetRequestClass(self, method_descriptor):
-    """Returns the class of the request message for the specified method.
-
-    CallMethod() requires that the request is of a particular subclass of
-    Message. GetRequestClass() gets the default instance of this required
-    type.
-
-    Example:
-      method = service.GetDescriptor().FindMethodByName("Foo")
-      request = stub.GetRequestClass(method)()
-      request.ParseFromString(input)
-      service.CallMethod(method, request, callback)
-    """
-    raise NotImplementedError
-
-  def GetResponseClass(self, method_descriptor):
-    """Returns the class of the response message for the specified method.
-
-    This method isn't really needed, as the RpcChannel's CallMethod constructs
-    the response protocol message. It's provided anyway in case it is useful
-    for the caller to know the response type in advance.
-    """
-    raise NotImplementedError
-
-
-class RpcController(object):
-
-  """An RpcController mediates a single method call.
-
-  The primary purpose of the controller is to provide a way to manipulate
-  settings specific to the RPC implementation and to find out about RPC-level
-  errors. The methods provided by the RpcController interface are intended
-  to be a "least common denominator" set of features which we expect all
-  implementations to support.  Specific implementations may provide more
-  advanced features (e.g. deadline propagation).
-  """
-
-  # Client-side methods below
-
-  def Reset(self):
-    """Resets the RpcController to its initial state.
-
-    After the RpcController has been reset, it may be reused in
-    a new call. Must not be called while an RPC is in progress.
-    """
-    raise NotImplementedError
-
-  def Failed(self):
-    """Returns true if the call failed.
-
-    After a call has finished, returns true if the call failed.  The possible
-    reasons for failure depend on the RPC implementation.  Failed() must not
-    be called before a call has finished.  If Failed() returns true, the
-    contents of the response message are undefined.
-    """
-    raise NotImplementedError
-
-  def ErrorText(self):
-    """If Failed is true, returns a human-readable description of the error."""
-    raise NotImplementedError
-
-  def StartCancel(self):
-    """Initiate cancellation.
-
-    Advises the RPC system that the caller desires that the RPC call be
-    canceled.  The RPC system may cancel it immediately, may wait awhile and
-    then cancel it, or may not even cancel the call at all.  If the call is
-    canceled, the "done" callback will still be called and the RpcController
-    will indicate that the call failed at that time.
-    """
-    raise NotImplementedError
-
-  # Server-side methods below
-
-  def SetFailed(self, reason):
-    """Sets a failure reason.
-
-    Causes Failed() to return true on the client side.  "reason" will be
-    incorporated into the message returned by ErrorText().  If you find
-    you need to return machine-readable information about failures, you
-    should incorporate it into your response protocol buffer and should
-    NOT call SetFailed().
-    """
-    raise NotImplementedError
-
-  def IsCanceled(self):
-    """Checks if the client cancelled the RPC.
-
-    If true, indicates that the client canceled the RPC, so the server may
-    as well give up on replying to it.  The server should still call the
-    final "done" callback.
-    """
-    raise NotImplementedError
-
-  def NotifyOnCancel(self, callback):
-    """Sets a callback to invoke on cancel.
-
-    Asks that the given callback be called when the RPC is canceled.  The
-    callback will always be called exactly once.  If the RPC completes without
-    being canceled, the callback will be called after completion.  If the RPC
-    has already been canceled when NotifyOnCancel() is called, the callback
-    will be called immediately.
-
-    NotifyOnCancel() must be called no more than once per request.
-    """
-    raise NotImplementedError
-
-
-class RpcChannel(object):
-
-  """Abstract interface for an RPC channel.
-
-  An RpcChannel represents a communication line to a service which can be used
-  to call that service's methods.  The service may be running on another
-  machine. Normally, you should not use an RpcChannel directly, but instead
-  construct a stub {@link Service} wrapping it.  Example:
-
-  Example:
-    RpcChannel channel = rpcImpl.Channel("remotehost.example.com:1234")
-    RpcController controller = rpcImpl.Controller()
-    MyService service = MyService_Stub(channel)
-    service.MyMethod(controller, request, callback)
-  """
-
-  def CallMethod(self, method_descriptor, rpc_controller,
-                 request, response_class, done):
-    """Calls the method identified by the descriptor.
-
-    Call the given method of the remote service.  The signature of this
-    procedure looks the same as Service.CallMethod(), but the requirements
-    are less strict in one important way:  the request object doesn't have to
-    be of any specific class as long as its descriptor is method.input_type.
-    """
-    raise NotImplementedError
diff --git a/froofle/protobuf/service_reflection.py b/froofle/protobuf/service_reflection.py
deleted file mode 100644
index bdd6bad..0000000
--- a/froofle/protobuf/service_reflection.py
+++ /dev/null
@@ -1,289 +0,0 @@
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""Contains metaclasses used to create protocol service and service stub
-classes from ServiceDescriptor objects at runtime.
-
-The GeneratedServiceType and GeneratedServiceStubType metaclasses are used to
-inject all useful functionality into the classes output by the protocol
-compiler at compile-time.
-"""
-
-__author__ = 'petar@google.com (Petar Petrov)'
-
-
-class GeneratedServiceType(type):
-
-  """Metaclass for service classes created at runtime from ServiceDescriptors.
-
-  Implementations for all methods described in the Service class are added here
-  by this class. We also create properties to allow getting/setting all fields
-  in the protocol message.
-
-  The protocol compiler currently uses this metaclass to create protocol service
-  classes at runtime. Clients can also manually create their own classes at
-  runtime, as in this example:
-
-  mydescriptor = ServiceDescriptor(.....)
-  class MyProtoService(service.Service):
-    __metaclass__ = GeneratedServiceType
-    DESCRIPTOR = mydescriptor
-  myservice_instance = MyProtoService()
-  ...
-  """
-
-  _DESCRIPTOR_KEY = 'DESCRIPTOR'
-
-  def __init__(cls, name, bases, dictionary):
-    """Creates a message service class.
-
-    Args:
-      name: Name of the class (ignored, but required by the metaclass
-        protocol).
-      bases: Base classes of the class being constructed.
-      dictionary: The class dictionary of the class being constructed.
-        dictionary[_DESCRIPTOR_KEY] must contain a ServiceDescriptor object
-        describing this protocol service type.
-    """
-    # Don't do anything if this class doesn't have a descriptor. This happens
-    # when a service class is subclassed.
-    if GeneratedServiceType._DESCRIPTOR_KEY not in dictionary:
-      return
-    descriptor = dictionary[GeneratedServiceType._DESCRIPTOR_KEY]
-    service_builder = _ServiceBuilder(descriptor)
-    service_builder.BuildService(cls)
-
-
-class GeneratedServiceStubType(GeneratedServiceType):
-
-  """Metaclass for service stubs created at runtime from ServiceDescriptors.
-
-  This class has similar responsibilities as GeneratedServiceType, except that
-  it creates the service stub classes.
-  """
-
-  _DESCRIPTOR_KEY = 'DESCRIPTOR'
-
-  def __init__(cls, name, bases, dictionary):
-    """Creates a message service stub class.
-
-    Args:
-      name: Name of the class (ignored, here).
-      bases: Base classes of the class being constructed.
-      dictionary: The class dictionary of the class being constructed.
-        dictionary[_DESCRIPTOR_KEY] must contain a ServiceDescriptor object
-        describing this protocol service type.
-    """
-    super(GeneratedServiceStubType, cls).__init__(name, bases, dictionary)
-    # Don't do anything if this class doesn't have a descriptor. This happens
-    # when a service stub is subclassed.
-    if GeneratedServiceStubType._DESCRIPTOR_KEY not in dictionary:
-      return
-    descriptor = dictionary[GeneratedServiceStubType._DESCRIPTOR_KEY]
-    service_stub_builder = _ServiceStubBuilder(descriptor)
-    service_stub_builder.BuildServiceStub(cls)
-
-
-class _ServiceBuilder(object):
-
-  """This class constructs a protocol service class using a service descriptor.
-
-  Given a service descriptor, this class constructs a class that represents
-  the specified service descriptor. One service builder instance constructs
-  exactly one service class. That means all instances of that class share the
-  same builder.
-  """
-
-  def __init__(self, service_descriptor):
-    """Initializes an instance of the service class builder.
-
-    Args:
-      service_descriptor: ServiceDescriptor to use when constructing the
-        service class.
-    """
-    self.descriptor = service_descriptor
-
-  def BuildService(self, cls):
-    """Constructs the service class.
-
-    Args:
-      cls: The class that will be constructed.
-    """
-
-    # CallMethod needs to operate with an instance of the Service class. This
-    # internal wrapper function exists only to be able to pass the service
-    # instance to the method that does the real CallMethod work.
-    def _WrapCallMethod(srvc, method_descriptor,
-                        rpc_controller, request, callback):
-      self._CallMethod(srvc, method_descriptor,
-                       rpc_controller, request, callback)
-    self.cls = cls
-    cls.CallMethod = _WrapCallMethod
-    cls.GetDescriptor = self._GetDescriptor
-    cls.GetRequestClass = self._GetRequestClass
-    cls.GetResponseClass = self._GetResponseClass
-    for method in self.descriptor.methods:
-      setattr(cls, method.name, self._GenerateNonImplementedMethod(method))
-
-  def _GetDescriptor(self):
-    """Retrieves the service descriptor.
-
-    Returns:
-      The descriptor of the service (of type ServiceDescriptor).
-    """
-    return self.descriptor
-
-  def _CallMethod(self, srvc, method_descriptor,
-                  rpc_controller, request, callback):
-    """Calls the method described by a given method descriptor.
-
-    Args:
-      srvc: Instance of the service for which this method is called.
-      method_descriptor: Descriptor that represent the method to call.
-      rpc_controller: RPC controller to use for this method's execution.
-      request: Request protocol message.
-      callback: A callback to invoke after the method has completed.
-    """
-    if method_descriptor.containing_service != self.descriptor:
-      raise RuntimeError(
-          'CallMethod() given method descriptor for wrong service type.')
-    method = getattr(srvc, method_descriptor.name)
-    method(rpc_controller, request, callback)
-
-  def _GetRequestClass(self, method_descriptor):
-    """Returns the class of the request protocol message.
-
-    Args:
-      method_descriptor: Descriptor of the method for which to return the
-        request protocol message class.
-
-    Returns:
-      A class that represents the input protocol message of the specified
-      method.
-    """
-    if method_descriptor.containing_service != self.descriptor:
-      raise RuntimeError(
-          'GetRequestClass() given method descriptor for wrong service type.')
-    return method_descriptor.input_type._concrete_class
-
-  def _GetResponseClass(self, method_descriptor):
-    """Returns the class of the response protocol message.
-
-    Args:
-      method_descriptor: Descriptor of the method for which to return the
-        response protocol message class.
-
-    Returns:
-      A class that represents the output protocol message of the specified
-      method.
-    """
-    if method_descriptor.containing_service != self.descriptor:
-      raise RuntimeError(
-          'GetResponseClass() given method descriptor for wrong service type.')
-    return method_descriptor.output_type._concrete_class
-
-  def _GenerateNonImplementedMethod(self, method):
-    """Generates and returns a method that can be set for a service methods.
-
-    Args:
-      method: Descriptor of the service method for which a method is to be
-        generated.
-
-    Returns:
-      A method that can be added to the service class.
-    """
-    return lambda inst, rpc_controller, request, callback: (
-        self._NonImplementedMethod(method.name, rpc_controller, callback))
-
-  def _NonImplementedMethod(self, method_name, rpc_controller, callback):
-    """The body of all methods in the generated service class.
-
-    Args:
-      method_name: Name of the method being executed.
-      rpc_controller: RPC controller used to execute this method.
-      callback: A callback which will be invoked when the method finishes.
-    """
-    rpc_controller.SetFailed('Method %s not implemented.' % method_name)
-    callback(None)
-
-
-class _ServiceStubBuilder(object):
-
-  """Constructs a protocol service stub class using a service descriptor.
-
-  Given a service descriptor, this class constructs a suitable stub class.
-  A stub is just a type-safe wrapper around an RpcChannel which emulates a
-  local implementation of the service.
-
-  One service stub builder instance constructs exactly one class. It means all
-  instances of that class share the same service stub builder.
-  """
-
-  def __init__(self, service_descriptor):
-    """Initializes an instance of the service stub class builder.
-
-    Args:
-      service_descriptor: ServiceDescriptor to use when constructing the
-        stub class.
-    """
-    self.descriptor = service_descriptor
-
-  def BuildServiceStub(self, cls):
-    """Constructs the stub class.
-
-    Args:
-      cls: The class that will be constructed.
-    """
-
-    def _ServiceStubInit(stub, rpc_channel):
-      stub.rpc_channel = rpc_channel
-    self.cls = cls
-    cls.__init__ = _ServiceStubInit
-    for method in self.descriptor.methods:
-      setattr(cls, method.name, self._GenerateStubMethod(method))
-
-  def _GenerateStubMethod(self, method):
-    return lambda inst, rpc_controller, request, callback: self._StubMethod(
-        inst, method, rpc_controller, request, callback)
-
-  def _StubMethod(self, stub, method_descriptor,
-                  rpc_controller, request, callback):
-    """The body of all service methods in the generated stub class.
-
-    Args:
-      stub: Stub instance.
-      method_descriptor: Descriptor of the invoked method.
-      rpc_controller: Rpc controller to execute the method.
-      request: Request protocol message.
-      callback: A callback to execute when the method finishes.
-    """
-    stub.rpc_channel.CallMethod(
-        method_descriptor, rpc_controller, request,
-        method_descriptor.output_type._concrete_class, callback)
diff --git a/froofle/protobuf/text_format.py b/froofle/protobuf/text_format.py
deleted file mode 100644
index 1c4cadf..0000000
--- a/froofle/protobuf/text_format.py
+++ /dev/null
@@ -1,125 +0,0 @@
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""Contains routines for printing protocol messages in text format."""
-
-__author__ = 'kenton@google.com (Kenton Varda)'
-
-import cStringIO
-
-from froofle.protobuf import descriptor
-
-__all__ = [ 'MessageToString', 'PrintMessage', 'PrintField', 'PrintFieldValue' ]
-
-def MessageToString(message):
-  out = cStringIO.StringIO()
-  PrintMessage(message, out)
-  result = out.getvalue()
-  out.close()
-  return result
-
-def PrintMessage(message, out, indent = 0):
-  for field, value in message.ListFields():
-    if field.label == descriptor.FieldDescriptor.LABEL_REPEATED:
-      for element in value:
-        PrintField(field, element, out, indent)
-    else:
-      PrintField(field, value, out, indent)
-
-def PrintField(field, value, out, indent = 0):
-  """Print a single field name/value pair.  For repeated fields, the value
-  should be a single element."""
-
-  out.write(' ' * indent);
-  if field.is_extension:
-    out.write('[')
-    if (field.containing_type.GetOptions().message_set_wire_format and
-        field.type == descriptor.FieldDescriptor.TYPE_MESSAGE and
-        field.message_type == field.extension_scope and
-        field.label == descriptor.FieldDescriptor.LABEL_OPTIONAL):
-      out.write(field.message_type.full_name)
-    else:
-      out.write(field.full_name)
-    out.write(']')
-  elif field.type == descriptor.FieldDescriptor.TYPE_GROUP:
-    # For groups, use the capitalized name.
-    out.write(field.message_type.name)
-  else:
-    out.write(field.name)
-
-  if field.cpp_type != descriptor.FieldDescriptor.CPPTYPE_MESSAGE:
-    # The colon is optional in this case, but our cross-language golden files
-    # don't include it.
-    out.write(': ')
-
-  PrintFieldValue(field, value, out, indent)
-  out.write('\n')
-
-def PrintFieldValue(field, value, out, indent = 0):
-  """Print a single field value (not including name).  For repeated fields,
-  the value should be a single element."""
-
-  if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE:
-    out.write(' {\n')
-    PrintMessage(value, out, indent + 2)
-    out.write(' ' * indent + '}')
-  elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM:
-    out.write(field.enum_type.values_by_number[value].name)
-  elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_STRING:
-    out.write('\"')
-    out.write(_CEscape(value))
-    out.write('\"')
-  elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_BOOL:
-    if value:
-      out.write("true")
-    else:
-      out.write("false")
-  else:
-    out.write(str(value))
-
-# text.encode('string_escape') does not seem to satisfy our needs as it
-# encodes unprintable characters using two-digit hex escapes whereas our
-# C++ unescaping function allows hex escapes to be any length.  So,
-# "\0011".encode('string_escape') ends up being "\\x011", which will be
-# decoded in C++ as a single-character string with char code 0x11.
-def _CEscape(text):
-  def escape(c):
-    o = ord(c)
-    if o == 10: return r"\n"   # optional escape
-    if o == 13: return r"\r"   # optional escape
-    if o ==  9: return r"\t"   # optional escape
-    if o == 39: return r"\'"   # optional escape
-
-    if o == 34: return r'\"'   # necessary escape
-    if o == 92: return r"\\"   # necessary escape
-
-    if o >= 127 or o < 32: return "\\%03o" % o # necessary escapes
-    return c
-  return "".join([escape(c) for c in text])
diff --git a/gerrit_upload.py b/gerrit_upload.py
deleted file mode 100755
index 17112aa..0000000
--- a/gerrit_upload.py
+++ /dev/null
@@ -1,174 +0,0 @@
-#
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed 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 getpass
-import os
-import sys
-from tempfile import mkstemp
-
-from codereview.proto_client import HttpRpc, Proxy
-from codereview.review_pb2 import ReviewService_Stub
-from codereview.upload_bundle_pb2 import *
-from git_command import GitCommand
-from error import UploadError
-
-try:
-  import readline
-except ImportError:
-  pass
-
-MAX_SEGMENT_SIZE = 1020 * 1024
-
-def _GetRpcServer(email, server, save_cookies):
-  """Returns an RpcServer.
-
-  Returns:
-    A new RpcServer, on which RPC calls can be made.
-  """
-
-  def GetUserCredentials():
-    """Prompts the user for a username and password."""
-    e = email
-    if e is None:
-      e = raw_input("Email: ").strip()
-    password = getpass.getpass("Password for %s: " % e)
-    return (e, password)
-
-  # If this is the dev_appserver, use fake authentication.
-  lc_server = server.lower()
-  if lc_server == "localhost" or lc_server.startswith("localhost:"):
-    if email is None:
-      email = "test@example.com"
-    server = HttpRpc(
-        server,
-        lambda: (email, "password"),
-        extra_headers={"Cookie":
-                       'dev_appserver_login="%s:False"' % email})
-    # Don't try to talk to ClientLogin.
-    server.authenticated = True
-    return server
-
-  if save_cookies:
-    cookie_file = ".gerrit_cookies"
-  else:
-    cookie_file = None
-
-  return HttpRpc(server, GetUserCredentials,
-                 cookie_file=cookie_file)
-
-def UploadBundle(project,
-                 server,
-                 email,
-                 dest_project,
-                 dest_branch,
-                 src_branch,
-                 bases,
-                 people,
-                 replace_changes = None,
-                 save_cookies=True):
-
-  srv = _GetRpcServer(email, server, save_cookies)
-  review = Proxy(ReviewService_Stub(srv))
-  tmp_fd, tmp_bundle = mkstemp(".bundle", ".gpq")
-  os.close(tmp_fd)
-
-  srcid = project.bare_git.rev_parse(src_branch)
-  revlist = project._revlist(src_branch, *bases)
-
-  if srcid not in revlist:
-    # This can happen if src_branch is an annotated tag
-    #
-    revlist.append(srcid)
-  revlist_size = len(revlist) * 42
-
-  try:
-    cmd = ['bundle', 'create', tmp_bundle, src_branch]
-    cmd.extend(bases)
-    if GitCommand(project, cmd).Wait() != 0:
-      raise UploadError('cannot create bundle')
-    fd = open(tmp_bundle, "rb")
-
-    bundle_id = None
-    segment_id = 0
-    next_data = fd.read(MAX_SEGMENT_SIZE - revlist_size)
-
-    while True:
-      this_data = next_data
-      next_data = fd.read(MAX_SEGMENT_SIZE)
-      segment_id += 1
-
-      if bundle_id is None:
-        req = UploadBundleRequest()
-        req.dest_project = str(dest_project)
-        req.dest_branch = str(dest_branch)
-        for e in people[0]:
-          req.reviewers.append(e)
-        for e in people[1]:
-          req.cc.append(e)
-        for c in revlist:
-          req.contained_object.append(c)
-        if replace_changes:
-          for change_id,commit_id in replace_changes.iteritems():
-            r = req.replace.add()
-            r.change_id = change_id
-            r.object_id = commit_id
-      else:
-        req = UploadBundleContinue()
-        req.bundle_id = bundle_id
-        req.segment_id = segment_id
-
-      req.bundle_data = this_data
-      if len(next_data) > 0:
-        req.partial_upload = True
-      else:
-        req.partial_upload = False
-
-      if bundle_id is None:
-        rsp = review.UploadBundle(req)
-      else:
-        rsp = review.ContinueBundle(req)
-
-      if rsp.status_code == UploadBundleResponse.CONTINUE:
-        bundle_id = rsp.bundle_id
-      elif rsp.status_code == UploadBundleResponse.RECEIVED:
-        bundle_id = rsp.bundle_id
-        return bundle_id
-      else:
-        if rsp.status_code == UploadBundleResponse.UNKNOWN_PROJECT:
-          reason = 'unknown project "%s"' % dest_project
-        elif rsp.status_code == UploadBundleResponse.UNKNOWN_BRANCH:
-          reason = 'unknown branch "%s"' % dest_branch
-        elif rsp.status_code == UploadBundleResponse.UNKNOWN_BUNDLE:
-          reason = 'unknown bundle'
-        elif rsp.status_code == UploadBundleResponse.NOT_BUNDLE_OWNER:
-          reason = 'not bundle owner'
-        elif rsp.status_code == UploadBundleResponse.BUNDLE_CLOSED:
-          reason = 'bundle closed'
-        elif rsp.status_code == UploadBundleResponse.UNAUTHORIZED_USER:
-          reason = ('Unauthorized user.  Visit http://%s/hello to sign up.'
-                    % server)
-        elif rsp.status_code == UploadBundleResponse.UNKNOWN_CHANGE:
-          reason = 'invalid change id'
-        elif rsp.status_code == UploadBundleResponse.CHANGE_CLOSED:
-          reason = 'one or more changes are closed'
-        elif rsp.status_code == UploadBundleResponse.UNKNOWN_EMAIL:
-          emails = [x for x in rsp.invalid_reviewers] + [
-                    x for x in rsp.invalid_cc]
-          reason = 'invalid email addresses: %s' % ", ".join(emails)
-        else:
-          reason = 'unknown error ' + str(rsp.status_code)
-        raise UploadError(reason)
-  finally:
-    os.unlink(tmp_bundle)
diff --git a/project.py b/project.py
index 5d036c3..eebe96d 100644
--- a/project.py
+++ b/project.py
@@ -24,10 +24,8 @@
 from color import Coloring
 from git_command import GitCommand
 from git_config import GitConfig, IsId
-from gerrit_upload import UploadBundle
 from error import GitError, ImportError, UploadError
 from remote import Remote
-from codereview import proto_client
 
 HEAD    = 'HEAD'
 R_HEADS = 'refs/heads/'
@@ -481,32 +479,7 @@
       branch.remote.projectname = self.name
       branch.remote.Save()
 
-    if branch.remote.ReviewProtocol == 'http-post':
-      base_list = []
-      for name, id in self._allrefs.iteritems():
-        if branch.remote.WritesTo(name):
-          base_list.append(not_rev(name))
-      if not base_list:
-        raise GitError('no base refs, cannot upload %s' % branch.name)
-
-      print >>sys.stderr, ''
-      _info("Uploading %s to %s:", branch.name, self.name)
-      try:
-        UploadBundle(project = self,
-                     server = branch.remote.review,
-                     email = self.UserEmail,
-                     dest_project = branch.remote.projectname,
-                     dest_branch = dest_branch,
-                     src_branch = R_HEADS + branch.name,
-                     bases = base_list,
-                     people = people,
-                     replace_changes = replace_changes)
-      except proto_client.ClientLoginError:
-        raise UploadError('Login failure')
-      except urllib2.HTTPError, e:
-        raise UploadError('HTTP error %d' % e.code)
-
-    elif branch.remote.ReviewProtocol == 'ssh':
+    if branch.remote.ReviewProtocol == 'ssh':
       if dest_branch.startswith(R_HEADS):
         dest_branch = dest_branch[len(R_HEADS):]