diff --git a/configure.ac b/configure.ac
index f23b253259ea7a1e63ddf98fb24fdd6755063c0a..203a2ff945751adbd68e8ce2ac6886ec12a20aea 100644
--- a/configure.ac
+++ b/configure.ac
@@ -7,7 +7,7 @@ AC_PREREQ(2.59)
 # * java/pom.xml
 # * python/setup.py
 # * src/google/protobuf/stubs/common.h
-AC_INIT(protobuf, 2.0.1, protobuf@googlegroups.com)
+AC_INIT(protobuf, 2.0.2-SNAPSHOT, protobuf@googlegroups.com)
 
 AC_CONFIG_SRCDIR(src/google/protobuf/message.cc)
 AM_CONFIG_HEADER(config.h)
diff --git a/java/pom.xml b/java/pom.xml
index 82f45bdc4aae73cc4f8292d3a27b5f87ec09bbd5..de27241fe90cb9b49de7b9147746415061b6072a 100644
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -10,7 +10,7 @@
   </parent>
   <groupId>com.google.protobuf</groupId>
   <artifactId>protobuf-java</artifactId>
-  <version>2.0.1</version>
+  <version>2.0.2-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>Protocol Buffer Java API</name>
   <description>
diff --git a/python/setup.py b/python/setup.py
index 44d0f39b74ffc184f41a301d837695304cfd321c..96896d573c48784a1387889e00732a403fcf6753 100755
--- a/python/setup.py
+++ b/python/setup.py
@@ -102,7 +102,7 @@ if __name__ == '__main__':
     generate_proto("../src/google/protobuf/descriptor.proto")
 
   setup(name = 'protobuf',
-        version = '2.0.1',
+        version = '2.0.2-SNAPSHOT',
         packages = [ 'google' ],
         namespace_packages = [ 'google' ],
         test_suite = 'setup.MakeTestSuite',
diff --git a/src/Makefile.am b/src/Makefile.am
index 2997cdd5235b03ceb305daf2e543a21551d6bb5e..7ba52706d387bf3746dedf50be895f790f06fdae 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -55,7 +55,7 @@ nobase_include_HEADERS =                                       \
 lib_LTLIBRARIES = libprotobuf.la libprotoc.la
 
 libprotobuf_la_LIBADD = $(PTHREAD_LIBS)
-libprotobuf_la_LDFLAGS = -version-info 0:0:0
+libprotobuf_la_LDFLAGS = -version-info 2:0:0
 libprotobuf_la_SOURCES =                                       \
   google/protobuf/stubs/common.cc                              \
   google/protobuf/stubs/hash.cc                                \
diff --git a/src/google/protobuf/descriptor.pb.h b/src/google/protobuf/descriptor.pb.h
index 926e9bd0002409f59cf6535ed61a5bad91c27e65..a1a5f1f3b362d84b8808b85b9062a075564b99a4 100644
--- a/src/google/protobuf/descriptor.pb.h
+++ b/src/google/protobuf/descriptor.pb.h
@@ -7,12 +7,12 @@
 
 #include <google/protobuf/stubs/common.h>
 
-#if GOOGLE_PROTOBUF_VERSION < 2000001
+#if GOOGLE_PROTOBUF_VERSION < 2000002
 #error This file was generated by a newer version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please update
 #error your headers.
 #endif
-#if 2000001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
+#if 2000002 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
 #error This file was generated by an older version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please
 #error regenerate this file with a newer version of protoc.
diff --git a/src/google/protobuf/stubs/common.h b/src/google/protobuf/stubs/common.h
index 89070d638b520c14cfa35c746e742663ff045614..2cc42f160347dc4a73687062e0da99869158f89b 100644
--- a/src/google/protobuf/stubs/common.h
+++ b/src/google/protobuf/stubs/common.h
@@ -65,24 +65,24 @@ namespace internal {
 
 // The current version, represented as a single integer to make comparison
 // easier:  major * 10^6 + minor * 10^3 + micro
-#define GOOGLE_PROTOBUF_VERSION 2000001
+#define GOOGLE_PROTOBUF_VERSION 2000002
 
 // The minimum library version which works with the current version of the
 // headers.
-#define GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION 2000001
+#define GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION 2000002
 
 // The minimum header version which works with the current version of
 // the library.  This constant should only be used by protoc's C++ code
 // generator.
-static const int kMinHeaderVersionForLibrary = 2000001;
+static const int kMinHeaderVersionForLibrary = 2000002;
 
 // The minimum protoc version which works with the current version of the
 // headers.
-#define GOOGLE_PROTOBUF_MIN_PROTOC_VERSION 2000001
+#define GOOGLE_PROTOBUF_MIN_PROTOC_VERSION 2000002
 
 // The minimum header version which works with the current version of
 // protoc.  This constant should only be used in VerifyVersion().
-static const int kMinHeaderVersionForProtoc = 2000001;
+static const int kMinHeaderVersionForProtoc = 2000002;
 
 // Verifies that the headers and libraries are compatible.  Use the macro
 // below to call this.
diff --git a/src/google/protobuf/stubs/hash.h b/src/google/protobuf/stubs/hash.h
index a62b3f6e4937a74bd7daa3219a713a800975291f..27b83ed49b17c4d57f36471ae7fcae3e8593d31e 100644
--- a/src/google/protobuf/stubs/hash.h
+++ b/src/google/protobuf/stubs/hash.h
@@ -29,15 +29,62 @@
 #include HASH_MAP_H
 #include HASH_SET_H
 #else
-// TODO(kenton):  Deal with non-existence of hash_map somehow.  Maybe emulate
-//   it with map?
-#error "Your STL implementation lacks hash_map and/or hash_set."
+#define MISSING_HASH
+#include <map>
+#include <set>
 #endif
 
 namespace google {
 namespace protobuf {
 
-#ifdef _MSC_VER
+#ifdef MISSING_HASH
+
+// This system doesn't have hash_map or hash_set.  Emulate them using map and
+// set.
+
+// Make hash<T> be the same as less<T>.  Note that everywhere where custom
+// hash functions are defined in the protobuf code, they are also defined such
+// that they can be used as "less" functions, which is required by MSVC anyway.
+template <typename Key>
+struct hash {
+  // Dummy, just to make derivative hash functions compile.
+  int operator()(const Key& key) {
+    GOOGLE_LOG(FATAL) << "Should never be called.";
+    return 0;
+  }
+
+  inline bool operator()(const Key& a, const Key& b) const {
+    return a < b;
+  }
+};
+
+// Make sure char* is compared by value.
+template <>
+struct hash<const char*> {
+  // Dummy, just to make derivative hash functions compile.
+  int operator()(const char* key) {
+    GOOGLE_LOG(FATAL) << "Should never be called.";
+    return 0;
+  }
+
+  inline bool operator()(const char* a, const char* b) const {
+    return strcmp(a, b) < 0;
+  }
+};
+
+template <typename Key, typename Data,
+          typename HashFcn = hash<Key>,
+          typename EqualKey = int >
+class hash_map : public std::map<Key, Data, HashFcn> {
+};
+
+template <typename Key,
+          typename HashFcn = hash<Key>,
+          typename EqualKey = int >
+class hash_set : public std::set<Key, HashFcn> {
+};
+
+#elif defined(_MSC_VER)
 
 template <typename Key>
 struct hash : public HASH_NAMESPACE::hash_compare<Key> {