diff --git a/api/current.txt b/api/current.txt
index bb313cd..56a4ae3 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -17993,15 +17993,24 @@
     method public static android.renderscript.Allocation createTyped(android.renderscript.RenderScript, android.renderscript.Type, int);
     method public static android.renderscript.Allocation createTyped(android.renderscript.RenderScript, android.renderscript.Type);
     method public void generateMipmaps();
+    method public int getBytesSize();
+    method public android.renderscript.Element getElement();
+    method public android.view.Surface getSurface();
     method public android.renderscript.Type getType();
+    method public int getUsage();
+    method public void ioReceive();
+    method public void ioSend();
     method public synchronized void resize(int);
     method public void setFromFieldPacker(int, android.renderscript.FieldPacker);
     method public void setFromFieldPacker(int, int, android.renderscript.FieldPacker);
+    method public void setSurface(android.view.Surface);
     method public void syncAll(int);
     field public static final int USAGE_GRAPHICS_CONSTANTS = 8; // 0x8
     field public static final int USAGE_GRAPHICS_RENDER_TARGET = 16; // 0x10
     field public static final int USAGE_GRAPHICS_TEXTURE = 2; // 0x2
     field public static final int USAGE_GRAPHICS_VERTEX = 4; // 0x4
+    field public static final int USAGE_IO_INPUT = 32; // 0x20
+    field public static final int USAGE_IO_OUTPUT = 64; // 0x40
     field public static final int USAGE_SCRIPT = 1; // 0x1
   }
 
@@ -18140,6 +18149,15 @@
     method public static android.renderscript.Element U8_4(android.renderscript.RenderScript);
     method public static android.renderscript.Element createPixel(android.renderscript.RenderScript, android.renderscript.Element.DataType, android.renderscript.Element.DataKind);
     method public static android.renderscript.Element createVector(android.renderscript.RenderScript, android.renderscript.Element.DataType, int);
+    method public int getBytesSize();
+    method public android.renderscript.Element.DataKind getDataKind();
+    method public android.renderscript.Element.DataType getDataType();
+    method public android.renderscript.Element getSubElement(int);
+    method public int getSubElementArraySize(int);
+    method public int getSubElementCount();
+    method public java.lang.String getSubElementName(int);
+    method public int getSubElementOffsetBytes(int);
+    method public int getVectorSize();
     method public boolean isCompatible(android.renderscript.Element);
     method public boolean isComplex();
   }
@@ -18172,6 +18190,7 @@
     enum_constant public static final android.renderscript.Element.DataType MATRIX_2X2;
     enum_constant public static final android.renderscript.Element.DataType MATRIX_3X3;
     enum_constant public static final android.renderscript.Element.DataType MATRIX_4X4;
+    enum_constant public static final android.renderscript.Element.DataType NONE;
     enum_constant public static final android.renderscript.Element.DataType RS_ALLOCATION;
     enum_constant public static final android.renderscript.Element.DataType RS_ELEMENT;
     enum_constant public static final android.renderscript.Element.DataType RS_MESH;
@@ -18486,12 +18505,18 @@
     method public void bindConstants(android.renderscript.Allocation, int);
     method public void bindSampler(android.renderscript.Sampler, int) throws java.lang.IllegalArgumentException;
     method public void bindTexture(android.renderscript.Allocation, int) throws java.lang.IllegalArgumentException;
+    method public android.renderscript.Type getConstant(int);
+    method public int getConstantCount();
+    method public int getTextureCount();
+    method public java.lang.String getTextureName(int);
+    method public android.renderscript.Program.TextureType getTextureType(int);
   }
 
   public static class Program.BaseProgramBuilder {
     ctor protected Program.BaseProgramBuilder(android.renderscript.RenderScript);
     method public android.renderscript.Program.BaseProgramBuilder addConstant(android.renderscript.Type) throws java.lang.IllegalStateException;
     method public android.renderscript.Program.BaseProgramBuilder addTexture(android.renderscript.Program.TextureType) throws java.lang.IllegalArgumentException;
+    method public android.renderscript.Program.BaseProgramBuilder addTexture(android.renderscript.Program.TextureType, java.lang.String) throws java.lang.IllegalArgumentException;
     method public int getCurrentConstantIndex();
     method public int getCurrentTextureIndex();
     method protected void initProgram(android.renderscript.Program);
@@ -18547,6 +18572,8 @@
     method public static android.renderscript.ProgramRaster CULL_BACK(android.renderscript.RenderScript);
     method public static android.renderscript.ProgramRaster CULL_FRONT(android.renderscript.RenderScript);
     method public static android.renderscript.ProgramRaster CULL_NONE(android.renderscript.RenderScript);
+    method public android.renderscript.ProgramRaster.CullMode getCullMode();
+    method public boolean isPointSpriteEnabled();
   }
 
   public static class ProgramRaster.Builder {
@@ -18569,6 +18596,15 @@
     method public static android.renderscript.ProgramStore BLEND_ALPHA_DEPTH_TEST(android.renderscript.RenderScript);
     method public static android.renderscript.ProgramStore BLEND_NONE_DEPTH_NONE(android.renderscript.RenderScript);
     method public static android.renderscript.ProgramStore BLEND_NONE_DEPTH_TEST(android.renderscript.RenderScript);
+    method public android.renderscript.ProgramStore.BlendDstFunc getBlendDstFunc();
+    method public android.renderscript.ProgramStore.BlendSrcFunc getBlendSrcFunc();
+    method public android.renderscript.ProgramStore.DepthFunc getDepthFunc();
+    method public boolean isColorMaskAlphaEnabled();
+    method public boolean isColorMaskBlueEnabled();
+    method public boolean isColorMaskGreenEnabled();
+    method public boolean isColorMaskRedEnabled();
+    method public boolean isDepthMaskEnabled();
+    method public boolean isDitherEnabled();
   }
 
   public static final class ProgramStore.BlendDstFunc extends java.lang.Enum {
@@ -18621,6 +18657,8 @@
   }
 
   public class ProgramVertex extends android.renderscript.Program {
+    method public android.renderscript.Element getInput(int);
+    method public int getInputCount();
   }
 
   public static class ProgramVertex.Builder extends android.renderscript.Program.BaseProgramBuilder {
@@ -18758,6 +18796,11 @@
     method public static android.renderscript.Sampler WRAP_LINEAR(android.renderscript.RenderScript);
     method public static android.renderscript.Sampler WRAP_LINEAR_MIP_LINEAR(android.renderscript.RenderScript);
     method public static android.renderscript.Sampler WRAP_NEAREST(android.renderscript.RenderScript);
+    method public float getAnisotropy();
+    method public android.renderscript.Sampler.Value getMagnification();
+    method public android.renderscript.Sampler.Value getMinification();
+    method public android.renderscript.Sampler.Value getWrapS();
+    method public android.renderscript.Sampler.Value getWrapT();
   }
 
   public static class Sampler.Builder {
diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java
index cd5300d..10ccb87 100644
--- a/graphics/java/android/renderscript/Allocation.java
+++ b/graphics/java/android/renderscript/Allocation.java
@@ -136,7 +136,6 @@
      * consumer.  This usage will cause the allocation to be created
      * read only.
      *
-     * @hide
      */
     public static final int USAGE_IO_INPUT = 0x0020;
 
@@ -145,7 +144,6 @@
      * SurfaceTexture producer.  The dimensions and format of the
      * SurfaceTexture will be forced to those of the allocation.
      *
-     * @hide
      */
     public static final int USAGE_IO_OUTPUT = 0x0040;
 
@@ -193,8 +191,8 @@
    /**
      * Get the element of the type of the Allocation.
      *
-     * @hide
-     * @return Element
+     * @return Element that describes the structure of data in the
+     *         allocation
      *
      */
     public Element getElement() {
@@ -204,8 +202,8 @@
     /**
      * Get the usage flags of the Allocation.
      *
-     * @hide
-     * @return usage
+     * @return usage flags associated with the allocation. e.g.
+     *         script, texture, etc.
      *
      */
     public int getUsage() {
@@ -215,12 +213,11 @@
     /**
      * Get the size of the Allocation in bytes.
      *
-     * @hide
-     * @return sizeInBytes
+     * @return size of the Allocation in bytes.
      *
      */
-    public int getSizeBytes() {
-        return mType.getCount() * mType.getElement().getSizeBytes();
+    public int getBytesSize() {
+        return mType.getCount() * mType.getElement().getBytesSize();
     }
 
     private void updateCacheInfo(Type t) {
@@ -362,8 +359,6 @@
      * Send a buffer to the output stream.  The contents of the
      * Allocation will be undefined after this operation.
      *
-     * @hide
-     *
      */
     public void ioSend() {
         if ((mUsage & USAGE_IO_OUTPUT) == 0) {
@@ -385,8 +380,6 @@
     /**
      * Receive the latest input into the Allocation.
      *
-     * @hide
-     *
      */
     public void ioReceive() {
         if ((mUsage & USAGE_IO_INPUT) == 0) {
@@ -424,37 +417,37 @@
                 throw new RSIllegalArgumentException("Allocation kind is " +
                                                      mType.getElement().mKind + ", type " +
                                                      mType.getElement().mType +
-                                                     " of " + mType.getElement().getSizeBytes() +
+                                                     " of " + mType.getElement().getBytesSize() +
                                                      " bytes, passed bitmap was " + bc);
             }
             break;
         case ARGB_8888:
             if ((mType.getElement().mKind != Element.DataKind.PIXEL_RGBA) ||
-                (mType.getElement().getSizeBytes() != 4)) {
+                (mType.getElement().getBytesSize() != 4)) {
                 throw new RSIllegalArgumentException("Allocation kind is " +
                                                      mType.getElement().mKind + ", type " +
                                                      mType.getElement().mType +
-                                                     " of " + mType.getElement().getSizeBytes() +
+                                                     " of " + mType.getElement().getBytesSize() +
                                                      " bytes, passed bitmap was " + bc);
             }
             break;
         case RGB_565:
             if ((mType.getElement().mKind != Element.DataKind.PIXEL_RGB) ||
-                (mType.getElement().getSizeBytes() != 2)) {
+                (mType.getElement().getBytesSize() != 2)) {
                 throw new RSIllegalArgumentException("Allocation kind is " +
                                                      mType.getElement().mKind + ", type " +
                                                      mType.getElement().mType +
-                                                     " of " + mType.getElement().getSizeBytes() +
+                                                     " of " + mType.getElement().getBytesSize() +
                                                      " bytes, passed bitmap was " + bc);
             }
             break;
         case ARGB_4444:
             if ((mType.getElement().mKind != Element.DataKind.PIXEL_RGBA) ||
-                (mType.getElement().getSizeBytes() != 2)) {
+                (mType.getElement().getBytesSize() != 2)) {
                 throw new RSIllegalArgumentException("Allocation kind is " +
                                                      mType.getElement().mKind + ", type " +
                                                      mType.getElement().mType +
-                                                     " of " + mType.getElement().getSizeBytes() +
+                                                     " of " + mType.getElement().getBytesSize() +
                                                      " bytes, passed bitmap was " + bc);
             }
             break;
@@ -583,7 +576,7 @@
      */
     public void setFromFieldPacker(int xoff, FieldPacker fp) {
         mRS.validate();
-        int eSize = mType.mElement.getSizeBytes();
+        int eSize = mType.mElement.getBytesSize();
         final byte[] data = fp.getData();
 
         int count = data.length / eSize;
@@ -612,7 +605,7 @@
         }
 
         final byte[] data = fp.getData();
-        int eSize = mType.mElement.mElements[component_number].getSizeBytes();
+        int eSize = mType.mElement.mElements[component_number].getBytesSize();
         eSize *= mType.mElement.mArraySizes[component_number];
 
         if (data.length != eSize) {
@@ -665,7 +658,7 @@
      * @param d the source data array
      */
     public void copy1DRangeFromUnchecked(int off, int count, int[] d) {
-        int dataSize = mType.mElement.getSizeBytes() * count;
+        int dataSize = mType.mElement.getBytesSize() * count;
         data1DChecks(off, count, d.length * 4, dataSize);
         mRS.nAllocationData1D(getIDSafe(), off, mSelectedLOD, count, d, dataSize);
     }
@@ -679,7 +672,7 @@
      * @param d the source data array
      */
     public void copy1DRangeFromUnchecked(int off, int count, short[] d) {
-        int dataSize = mType.mElement.getSizeBytes() * count;
+        int dataSize = mType.mElement.getBytesSize() * count;
         data1DChecks(off, count, d.length * 2, dataSize);
         mRS.nAllocationData1D(getIDSafe(), off, mSelectedLOD, count, d, dataSize);
     }
@@ -693,7 +686,7 @@
      * @param d the source data array
      */
     public void copy1DRangeFromUnchecked(int off, int count, byte[] d) {
-        int dataSize = mType.mElement.getSizeBytes() * count;
+        int dataSize = mType.mElement.getBytesSize() * count;
         data1DChecks(off, count, d.length, dataSize);
         mRS.nAllocationData1D(getIDSafe(), off, mSelectedLOD, count, d, dataSize);
     }
@@ -707,7 +700,7 @@
      * @param d the source data array
      */
     public void copy1DRangeFromUnchecked(int off, int count, float[] d) {
-        int dataSize = mType.mElement.getSizeBytes() * count;
+        int dataSize = mType.mElement.getBytesSize() * count;
         data1DChecks(off, count, d.length * 4, dataSize);
         mRS.nAllocationData1D(getIDSafe(), off, mSelectedLOD, count, d, dataSize);
     }
@@ -1030,30 +1023,6 @@
     }
 
     /**
-     * @hide
-     * This API is hidden and only intended to be used for
-     * transitional purposes.
-     *
-     * @param type renderscript type describing data layout
-     * @param mips specifies desired mipmap behaviour for the
-     *             allocation
-     * @param usage bit field specifying how the allocation is
-     *              utilized
-     */
-    static public Allocation createTyped(RenderScript rs, Type type, MipmapControl mips,
-                                         int usage, int pointer) {
-        rs.validate();
-        if (type.getID(rs) == 0) {
-            throw new RSInvalidStateException("Bad Type");
-        }
-        int id = rs.nAllocationCreateTyped(type.getID(rs), mips.mID, usage, pointer);
-        if (id == 0) {
-            throw new RSRuntimeException("Allocation creation failed.");
-        }
-        return new Allocation(id, rs, type, usage);
-    }
-
-    /**
      * Creates a renderscript allocation with the size specified by
      * the type and no mipmaps generated by default
      *
@@ -1194,8 +1163,11 @@
     }
 
     /**
+     * For allocations used with io operations, returns the handle
+     * onto a raw buffer that is being managed by the screen
+     * compositor.
      *
-     * @hide
+     * @return Surface object associated with allocation
      *
      */
     public Surface getSurface() {
@@ -1203,7 +1175,9 @@
     }
 
     /**
-     * @hide
+     * Associate a surface for io output with this allocation
+     *
+     * @param sur Surface to associate with allocation
      */
     public void setSurface(Surface sur) {
         mRS.validate();
diff --git a/graphics/java/android/renderscript/Element.java b/graphics/java/android/renderscript/Element.java
index d75c951..80c70bc 100644
--- a/graphics/java/android/renderscript/Element.java
+++ b/graphics/java/android/renderscript/Element.java
@@ -85,13 +85,13 @@
     }
 
     /**
-    * @hide
     * @return element size in bytes
     */
-    public int getSizeBytes() {return mSize;}
+    public int getBytesSize() {return mSize;}
 
     /**
-    * @hide
+    * Returns the number of vector components. 2 for float2, 4 for
+    * float4, etc.
     * @return element vector size
     */
     public int getVectorSize() {return mVectorSize;}
@@ -114,10 +114,6 @@
      * RS_* objects.  32 bit opaque handles.
      */
     public enum DataType {
-        /**
-        * @hide
-        * new enum
-        */
         NONE (0, 0),
         //FLOAT_16 (1, 2),
         FLOAT_32 (2, 4),
@@ -201,7 +197,10 @@
     }
 
     /**
-    * @hide
+    * Elements could be simple, such as an int or a float, or a
+    * structure with multiple sub elements, such as a collection of
+    * floats, float2, float4. This function returns zero for simple
+    * elements or the number of sub-elements otherwise.
     * @return number of sub-elements in this element
     */
     public int getSubElementCount() {
@@ -212,7 +211,8 @@
     }
 
     /**
-    * @hide
+    * For complex elements, this function will return the
+    * sub-element at index
     * @param index index of the sub-element to return
     * @return sub-element in this element at given index
     */
@@ -227,7 +227,8 @@
     }
 
     /**
-    * @hide
+    * For complex elements, this function will return the
+    * sub-element name at index
     * @param index index of the sub-element
     * @return sub-element in this element at given index
     */
@@ -242,7 +243,9 @@
     }
 
     /**
-    * @hide
+    * For complex elements, some sub-elements could be statically
+    * sized arrays. This function will return the array size for
+    * sub-element at index
     * @param index index of the sub-element
     * @return array size of sub-element in this element at given index
     */
@@ -257,7 +260,8 @@
     }
 
     /**
-    * @hide
+    * This function specifies the location of a sub-element within
+    * the element
     * @param index index of the sub-element
     * @return offset in bytes of sub-element in this element at given index
     */
@@ -272,7 +276,6 @@
     }
 
     /**
-    * @hide
     * @return element data type
     */
     public DataType getDataType() {
@@ -280,7 +283,6 @@
     }
 
     /**
-    * @hide
     * @return element data kind
     */
     public DataKind getDataKind() {
diff --git a/graphics/java/android/renderscript/Program.java b/graphics/java/android/renderscript/Program.java
index 104d1cd..d9f64c6 100644
--- a/graphics/java/android/renderscript/Program.java
+++ b/graphics/java/android/renderscript/Program.java
@@ -78,14 +78,20 @@
     }
 
     /**
-     * @hide
+     * Program object can have zero or more constant allocations
+     * associated with it. This method returns the total count.
+     * @return number of constant input types
      */
     public int getConstantCount() {
         return mConstants != null ? mConstants.length : 0;
     }
 
     /**
-     * @hide
+     * Returns the type of the constant buffer used in the program
+     * object. It could be used to query internal elements or create
+     * an allocation to store constant data.
+     * @param slot index of the constant input type to return
+     * @return constant input type
      */
     public Type getConstant(int slot) {
         if (slot < 0 || slot >= mConstants.length) {
@@ -95,14 +101,17 @@
     }
 
     /**
-     * @hide
+     * Returns the number of textures used in this program object
+     * @return number of texture inputs
      */
     public int getTextureCount() {
         return mTextureCount;
     }
 
     /**
-     * @hide
+     * Returns the type of texture at a given slot. e.g. 2D or Cube
+     * @param slot index of the texture input
+     * @return texture input type
      */
     public TextureType getTextureType(int slot) {
         if ((slot < 0) || (slot >= mTextureCount)) {
@@ -112,7 +121,10 @@
     }
 
     /**
-     * @hide
+     * Returns the name of the texture input at a given slot. e.g.
+     * tex0, diffuse, spec
+     * @param slot index of the texture input
+     * @return texture input name
      */
     public String getTextureName(int slot) {
         if ((slot < 0) || (slot >= mTextureCount)) {
@@ -318,7 +330,6 @@
         }
 
         /**
-         * @hide
          * Adds a texture input to the Program
          *
          * @param texType describes that the texture to append it (2D,
diff --git a/graphics/java/android/renderscript/ProgramRaster.java b/graphics/java/android/renderscript/ProgramRaster.java
index 93ee0ce..e40751f 100644
--- a/graphics/java/android/renderscript/ProgramRaster.java
+++ b/graphics/java/android/renderscript/ProgramRaster.java
@@ -48,15 +48,16 @@
     }
 
     /**
-     * @hide
+     * Specifies whether vertices are rendered as screen aligned
+     * elements of a specified size
      * @return whether point sprites are enabled
      */
-    public boolean getPointSpriteEnabled() {
+    public boolean isPointSpriteEnabled() {
         return mPointSprite;
     }
 
     /**
-     * @hide
+     * Specifies how triangles are culled based on their orientation
      * @return cull mode
      */
     public CullMode getCullMode() {
diff --git a/graphics/java/android/renderscript/ProgramStore.java b/graphics/java/android/renderscript/ProgramStore.java
index 677dadd..d0fd6e5 100644
--- a/graphics/java/android/renderscript/ProgramStore.java
+++ b/graphics/java/android/renderscript/ProgramStore.java
@@ -150,7 +150,8 @@
     }
 
     /**
-    * @hide
+    * Returns the function used to test writing into the depth
+    * buffer
     * @return depth function
     */
     public DepthFunc getDepthFunc() {
@@ -158,47 +159,47 @@
     }
 
     /**
-    * @hide
-    * @return whether depth writes are enabled
+    * Queries whether writes are enabled into the depth buffer
+    * @return depth mask
     */
-    public boolean getDepthMaskEnabled() {
+    public boolean isDepthMaskEnabled() {
         return mDepthMask;
     }
 
     /**
-    * @hide
+    * Queries whether red channel is written
     * @return red color channel mask
     */
-    public boolean getColorMaskREnabled() {
+    public boolean isColorMaskRedEnabled() {
         return mColorMaskR;
     }
 
     /**
-    * @hide
+    * Queries whether green channel is written
     * @return green color channel mask
     */
-    public boolean getColorMaskGEnabled() {
+    public boolean isColorMaskGreenEnabled() {
         return mColorMaskG;
     }
 
     /**
-    * @hide
+    * Queries whether blue channel is written
     * @return blue color channel mask
     */
-    public boolean getColorMaskBEnabled() {
+    public boolean isColorMaskBlueEnabled() {
         return mColorMaskB;
     }
 
     /**
-    * @hide
+    * Queries whether alpha channel is written
     * @return alpha channel mask
     */
-    public boolean getColorMaskAEnabled() {
+    public boolean isColorMaskAlphaEnabled() {
         return mColorMaskA;
     }
 
     /**
-    * @hide
+    * Specifies how the source blending factor is computed
     * @return source blend function
     */
     public BlendSrcFunc getBlendSrcFunc() {
@@ -206,7 +207,7 @@
     }
 
     /**
-    * @hide
+    * Specifies how the destination blending factor is computed
     * @return destination blend function
     */
     public BlendDstFunc getBlendDstFunc() {
@@ -214,10 +215,11 @@
     }
 
     /**
-    * @hide
+    * Specifies whether colors are dithered before writing into the
+    * framebuffer
     * @return whether dither is enabled
     */
-    public boolean getDitherEnabled() {
+    public boolean isDitherEnabled() {
         return mDither;
     }
 
diff --git a/graphics/java/android/renderscript/ProgramVertex.java b/graphics/java/android/renderscript/ProgramVertex.java
index 32c908e..74d666b 100644
--- a/graphics/java/android/renderscript/ProgramVertex.java
+++ b/graphics/java/android/renderscript/ProgramVertex.java
@@ -55,14 +55,15 @@
     }
 
     /**
-     * @hide
+     * @return number of input attribute elements
      */
     public int getInputCount() {
         return mInputs != null ? mInputs.length : 0;
     }
 
     /**
-     * @hide
+     * @param slot location of the input to return
+     * @return input attribute element
      */
     public Element getInput(int slot) {
         if (slot < 0 || slot >= mInputs.length) {
diff --git a/graphics/java/android/renderscript/ProgramVertexFixedFunction.java b/graphics/java/android/renderscript/ProgramVertexFixedFunction.java
index fac4c3d..54f21b8 100644
--- a/graphics/java/android/renderscript/ProgramVertexFixedFunction.java
+++ b/graphics/java/android/renderscript/ProgramVertexFixedFunction.java
@@ -204,7 +204,7 @@
         public Constants(RenderScript rs) {
             Type constInputType = ProgramVertexFixedFunction.Builder.getConstantInputType(rs);
             mAlloc = Allocation.createTyped(rs, constInputType);
-            int bufferSize = constInputType.getElement().getSizeBytes()*
+            int bufferSize = constInputType.getElement().getBytesSize()*
                              constInputType.getCount();
             mIOBuffer = new FieldPacker(bufferSize);
             mModel = new Matrix4f();
diff --git a/graphics/java/android/renderscript/Sampler.java b/graphics/java/android/renderscript/Sampler.java
index 0a3c91d..0df1012 100644
--- a/graphics/java/android/renderscript/Sampler.java
+++ b/graphics/java/android/renderscript/Sampler.java
@@ -59,7 +59,6 @@
     }
 
     /**
-     * @hide
      * @return minification setting for the sampler
      */
     public Value getMinification() {
@@ -67,7 +66,6 @@
     }
 
     /**
-     * @hide
      * @return magnification setting for the sampler
      */
     public Value getMagnification() {
@@ -75,7 +73,6 @@
     }
 
     /**
-     * @hide
      * @return S wrapping mode for the sampler
      */
     public Value getWrapS() {
@@ -83,7 +80,6 @@
     }
 
     /**
-     * @hide
      * @return T wrapping mode for the sampler
      */
     public Value getWrapT() {
@@ -91,7 +87,6 @@
     }
 
     /**
-     * @hide
      * @return anisotropy setting for the sampler
      */
     public float getAnisotropy() {
@@ -288,7 +283,7 @@
 
         public Sampler create() {
             mRS.validate();
-            int id = mRS.nSamplerCreate(mMag.mID, mMin.mID, 
+            int id = mRS.nSamplerCreate(mMag.mID, mMin.mID,
                                         mWrapS.mID, mWrapT.mID, mWrapR.mID, mAniso);
             Sampler sampler = new Sampler(id, mRS);
             sampler.mMin = mMin;
diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_element.java b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_element.java
index 3e2a2ca..f52fe6f 100644
--- a/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_element.java
+++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_element.java
@@ -108,7 +108,7 @@
         _RS_ASSERT("complexElemsimpleElem.getDataType() == NONE",
                    complexElem.getDataType() == DataType.NONE);
         _RS_ASSERT("complexElem.getSizeBytes() == ScriptField_ComplexStruct.Item.sizeof",
-                   complexElem.getSizeBytes() == ScriptField_ComplexStruct.Item.sizeof);
+                   complexElem.getBytesSize() == ScriptField_ComplexStruct.Item.sizeof);
 
         for (int i = 0; i < subElemCount; i ++) {
             _RS_ASSERT("complexElem.getSubElement(i) != null",
diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_program_raster.java b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_program_raster.java
index 1de4d71..ca54ac4 100644
--- a/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_program_raster.java
+++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_program_raster.java
@@ -60,13 +60,13 @@
     }
 
     private void testJavaSide(RenderScript RS) {
-        _RS_ASSERT("pointSpriteEnabled.getPointSpriteEnabled() == true",
-                    pointSpriteEnabled.getPointSpriteEnabled() == true);
+        _RS_ASSERT("pointSpriteEnabled.isPointSpriteEnabled() == true",
+                    pointSpriteEnabled.isPointSpriteEnabled() == true);
         _RS_ASSERT("pointSpriteEnabled.getCullMode() == ProgramRaster.CullMode.BACK",
                     pointSpriteEnabled.getCullMode() == ProgramRaster.CullMode.BACK);
 
-        _RS_ASSERT("cullMode.getPointSpriteEnabled() == false",
-                    cullMode.getPointSpriteEnabled() == false);
+        _RS_ASSERT("cullMode.isPointSpriteEnabled() == false",
+                    cullMode.isPointSpriteEnabled() == false);
         _RS_ASSERT("cullMode.getCullMode() == ProgramRaster.CullMode.FRONT",
                     cullMode.getCullMode() == ProgramRaster.CullMode.FRONT);
     }
diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_program_store.java b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_program_store.java
index 72a401d..4410ee3 100644
--- a/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_program_store.java
+++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_program_store.java
@@ -112,15 +112,15 @@
                      boolean B,
                      boolean A,
                      boolean dither) {
-        _RS_ASSERT("ps.getDepthMaskEnabled() == depthMask", ps.getDepthMaskEnabled() == depthMask);
+        _RS_ASSERT("ps.isDepthMaskEnabled() == depthMask", ps.isDepthMaskEnabled() == depthMask);
         _RS_ASSERT("ps.getDepthFunc() == df", ps.getDepthFunc() == df);
         _RS_ASSERT("ps.getBlendSrcFunc() == bsf", ps.getBlendSrcFunc() == bsf);
         _RS_ASSERT("ps.getBlendDstFunc() == bdf", ps.getBlendDstFunc() == bdf);
-        _RS_ASSERT("ps.getColorMaskREnabled() == R", ps.getColorMaskREnabled() == R);
-        _RS_ASSERT("ps.getColorMaskGEnabled() == G", ps.getColorMaskGEnabled() == G);
-        _RS_ASSERT("ps.getColorMaskBEnabled() == B", ps.getColorMaskBEnabled() == B);
-        _RS_ASSERT("ps.getColorMaskAEnabled() == A", ps.getColorMaskAEnabled() == A);
-        _RS_ASSERT("ps.getDitherEnabled() == dither", ps.getDitherEnabled() == dither);
+        _RS_ASSERT("ps.isColorMaskRedEnabled() == R", ps.isColorMaskRedEnabled() == R);
+        _RS_ASSERT("ps.isColorMaskGreenEnabled() == G", ps.isColorMaskGreenEnabled() == G);
+        _RS_ASSERT("ps.isColorMaskBlueEnabled () == B", ps.isColorMaskBlueEnabled () == B);
+        _RS_ASSERT("ps.isColorMaskAlphaEnabled() == A", ps.isColorMaskAlphaEnabled() == A);
+        _RS_ASSERT("ps.isDitherEnabled() == dither", ps.isDitherEnabled() == dither);
     }
 
     void varyBuilderColorAndDither(ProgramStore.Builder pb,
