diff --git a/lib/java/build.xml b/lib/java/build.xml
index c0c2374..eb74125 100644
--- a/lib/java/build.xml
+++ b/lib/java/build.xml
@@ -242,6 +242,9 @@
     <exec executable="../../compiler/cpp/thrift" failonerror="true">
       <arg line="--gen java:beans,nocamel ${test.thrift.home}/JavaBeansTest.thrift"/>
     </exec>
+    <exec executable="../../compiler/cpp/thrift" failonerror="true">
+      <arg line="--gen java:hashcode ${test.thrift.home}/ManyOptionals.thrift"/>
+    </exec>
   </target>
 
   <target name="proxy" if="proxy.enabled">
diff --git a/lib/java/src/org/apache/thrift/EncodingUtils.java b/lib/java/src/org/apache/thrift/EncodingUtils.java
index 072de93..bf14ef5 100644
--- a/lib/java/src/org/apache/thrift/EncodingUtils.java
+++ b/lib/java/src/org/apache/thrift/EncodingUtils.java
@@ -82,4 +82,67 @@
         | ((buf[offset + 2] & 0xff) << 8) | ((buf[offset + 3] & 0xff));
   }
 
+  /**
+   * Bitfield utilities.
+   * Returns true if the bit at position is set in v.
+   */
+  public static final boolean testBit(byte v, int position) {
+    return testBit((int)v, position);
+  }
+
+  public static final boolean testBit(short v, int position) {
+    return testBit((int)v, position);
+  }
+
+  public static final boolean testBit(int v, int position) {
+    return (v & (1 << position)) != 0;
+  }
+
+  public static final boolean testBit(long v, int position) {
+    return (v & (1L << position)) != 0L;
+  }
+
+  /**
+   * Returns v, with the bit at position set to zero.
+   */
+  public static final byte clearBit(byte v, int position) {
+    return (byte)clearBit((int)v, position);
+  }
+
+  public static final short clearBit(short v, int position) {
+    return (short)clearBit((int)v, position);
+  }
+
+  public static final int clearBit(int v, int position) {
+    return v & ~(1 << position);
+  }
+
+  public static final long clearBit(long v, int position) {
+    return v & ~(1L << position);
+  }
+
+  /**
+   * Returns v, with the bit at position set to 1 or 0 depending on value.
+   */
+  public static final byte setBit(byte v, int position, boolean value) {
+    return (byte)setBit((int)v, position, value);
+  }
+
+  public static final short setBit(short v, int position, boolean value) {
+    return (short)setBit((int)v, position, value);
+  }
+
+  public static final int setBit(int v, int position, boolean value) {
+    if(value)
+      return v | (1 << position);
+    else
+      return clearBit(v, position);
+  }
+
+  public static final long setBit(long v, int position, boolean value) {
+    if(value)
+      return v | (1L << position);
+    else
+      return clearBit(v, position);
+  }
 }
diff --git a/lib/java/test/org/apache/thrift/TestOptionals.java b/lib/java/test/org/apache/thrift/TestOptionals.java
new file mode 100644
index 0000000..d1591ee
--- /dev/null
+++ b/lib/java/test/org/apache/thrift/TestOptionals.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+package org.apache.thrift;
+
+import junit.framework.TestCase;
+
+import thrift.test.Opt4;
+import thrift.test.Opt30;
+import thrift.test.Opt64;
+import thrift.test.Opt80;
+
+// Exercises the isSet methods using structs from from ManyOptionals.thrift
+public class TestOptionals extends TestCase {
+  public void testEncodingUtils() throws Exception {
+    assertEquals((short)0x8, EncodingUtils.setBit((short)0, 3, true));
+    assertEquals((short)0, EncodingUtils.setBit((short)0x8, 3, false));
+    assertEquals(true, EncodingUtils.testBit((short)0x8, 3));
+    assertEquals(false, EncodingUtils.testBit((short)0x8, 4));
+
+    assertEquals((short)Short.MIN_VALUE, EncodingUtils.setBit((short)0, 15, true));
+    assertEquals((short)0, EncodingUtils.setBit((short)Short.MIN_VALUE, 15, false));
+    assertEquals(true, EncodingUtils.testBit(Short.MIN_VALUE, 15));
+    assertEquals(false, EncodingUtils.testBit(Short.MIN_VALUE, 14));
+  }
+
+  public void testOpt4() throws Exception {
+    Opt4 x = new Opt4();
+    assertEquals(false, x.isSetDef1());
+    x.setDef1(3);
+    assertEquals(true, x.isSetDef1());
+    assertEquals(false, x.isSetDef2());
+
+    Opt4 copy = new Opt4(x);
+    assertEquals(true, copy.isSetDef1());
+    copy.unsetDef1();
+    assertEquals(false, copy.isSetDef1());
+    assertEquals(true, x.isSetDef1());
+  }
+
+  public void testOpt30() throws Exception {
+    Opt30 x = new Opt30();
+    assertEquals(false, x.isSetDef1());
+    x.setDef1(3);
+    assertEquals(true, x.isSetDef1());
+    assertEquals(false, x.isSetDef2());
+  }
+
+  public void testOpt64() throws Exception {
+    Opt64 x = new Opt64();
+    assertEquals(false, x.isSetDef1());
+    x.setDef1(3);
+    assertEquals(true, x.isSetDef1());
+    assertEquals(false, x.isSetDef2());
+    x.setDef64(22);
+    assertEquals(true, x.isSetDef64());
+    assertEquals(false, x.isSetDef63());
+  }
+
+  public void testOpt80() throws Exception {
+    Opt80 x = new Opt80();
+    assertEquals(false, x.isSetDef1());
+    x.setDef1(3);
+    assertEquals(true, x.isSetDef1());
+    assertEquals(false, x.isSetDef2());
+
+    Opt80 copy = new Opt80(x);
+    copy.unsetDef1();
+    assertEquals(false, copy.isSetDef1());
+    assertEquals(true, x.isSetDef1());
+  }
+}
