Fix issues: 223 224 242.
diff --git a/python/README.txt b/python/README.txt
index 96f1a73..73a2656 100644
--- a/python/README.txt
+++ b/python/README.txt
@@ -63,6 +63,9 @@
      $ python setup.py install
 
    This step may require superuser privileges.
+   NOTE: To use C++ implementation, you need to export the environment variable
+   before this step. See the "C++ Implementation" section below for more
+   details.
 
 Usage
 =====
@@ -71,3 +74,24 @@
 web at:
 
   http://code.google.com/apis/protocolbuffers/
+
+C++ Implementation
+==================
+
+WARNING: This is EXPERIMENTAL and only available for CPython platforms.
+
+The C++ implementation for Python messages is built as a Python extension to
+improve the overall protobuf Python performance.
+
+To use the C++ implementation, export an environment variable:
+
+  $ export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp
+
+You need to export this variable before running setup.py script to build and
+install the extension.  You must also set the variable at runtime, otherwise
+the pure-Python implementation will be used. In a future release, we will
+change the default so that C++ implementation is used whenever it is available.
+It is strongly recommended to run `python setup.py test` after setting the
+variable to "cpp", so the tests will be against C++ implemented Python
+messages.
+
diff --git a/python/setup.py b/python/setup.py
index 47646a8..53e8b4a 100755
--- a/python/setup.py
+++ b/python/setup.py
@@ -102,17 +102,22 @@
     # Generate necessary .proto file if it doesn't exist.
     # TODO(kenton):  Maybe we should hook this into a distutils command?
     generate_proto("../src/google/protobuf/descriptor.proto")
+    generate_proto("../src/google/protobuf/compiler/plugin.proto")
 
-  python_c_extension = Extension("google.protobuf.internal._net_proto2___python",
-                                 [ "google/protobuf/pyext/python_descriptor.cc",
-                                   "google/protobuf/pyext/python_protobuf.cc",
-                                   "google/protobuf/pyext/python-proto2.cc",
-                                   ],
-                                 include_dirs = [ "../src", ".", ],
-                                 libraries = [ "protobuf" ],
-                                 runtime_library_dirs = [ "../src/.libs" ],
-                                 library_dirs = [ "../src/.libs" ],
-                                 )
+  ext_module_list = []
+
+  # C++ implementation extension
+  if os.getenv("PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION", "python") == "cpp":
+    print "Using EXPERIMENTAL C++ Implmenetation."
+    ext_module_list.append(Extension(
+        "google.protobuf.internal._net_proto2___python",
+        [ "google/protobuf/pyext/python_descriptor.cc",
+          "google/protobuf/pyext/python_protobuf.cc",
+          "google/protobuf/pyext/python-proto2.cc" ],
+        include_dirs = [ "../src", ".", ],
+        libraries = [ "protobuf" ],
+        runtime_library_dirs = [ "../src/.libs" ],
+        library_dirs = [ "../src/.libs" ]))
 
   setup(name = 'protobuf',
         version = '2.4.0-pre',
@@ -132,12 +137,13 @@
           'google.protobuf.internal.wire_format',
           'google.protobuf.descriptor',
           'google.protobuf.descriptor_pb2',
+          'google.protobuf.compiler.plugin_pb2',
           'google.protobuf.message',
           'google.protobuf.reflection',
           'google.protobuf.service',
           'google.protobuf.service_reflection',
           'google.protobuf.text_format' ],
-        ext_modules = [ python_c_extension ],
+        ext_modules = ext_module_list,
         url = 'http://code.google.com/p/protobuf/',
         maintainer = maintainer_email,
         maintainer_email = 'protobuf@googlegroups.com',