diff --git a/services/surfaceflinger/LayerBase.h b/services/surfaceflinger/LayerBase.h
index 33de5fe..01d82d4 100644
--- a/services/surfaceflinger/LayerBase.h
+++ b/services/surfaceflinger/LayerBase.h
@@ -44,7 +44,6 @@
 class DisplayDevice;
 class GraphicBuffer;
 class Layer;
-class LayerBaseClient;
 class SurfaceFlinger;
 
 // ---------------------------------------------------------------------------
@@ -57,15 +56,25 @@
  * Layers are organized into "layer stacks".  Each layer is a member of
  * exactly one layer stack, identified by an integer in Layer::State.  A
  * given layer stack may appear on more than one display.
- *
- * Notable subclasses (below LayerBaseClient) include Layer and LayerDim.
  */
 class LayerBase : virtual public RefBase
 {
     static int32_t sSequence;
 
 public:
-            LayerBase(SurfaceFlinger* flinger);
+            LayerBase(SurfaceFlinger* flinger, const sp<Client>& client);
+
+
+            // Creates an ISurface associated with this object.  This may only be
+            // called once (see also getSurfaceBinder()).
+            sp<ISurface> getSurface();
+
+            // Returns the Binder object for the ISurface associated with
+            // this object.
+            wp<IBinder> getSurfaceBinder() const;
+
+            virtual wp<IBinder> getSurfaceTextureBinder() const;
+
 
     mutable bool        contentDirty;
             // regions below are in window-manager space
@@ -138,7 +147,6 @@
             Rect computeBounds() const;
 
 
-    virtual sp<LayerBaseClient> getLayerBaseClient() const;
     virtual sp<Layer> getLayer() const;
 
     virtual const char* getTypeId() const { return "LayerBase"; }
@@ -294,6 +302,8 @@
     bool getFiltering() const;
 
 private:
+    virtual sp<ISurface> createSurface();
+
     Rect computeCrop(const sp<const DisplayDevice>& hw) const;
 
 protected:
@@ -301,6 +311,23 @@
                   GLclampf r, GLclampf g, GLclampf b, GLclampf alpha) const;
           void drawWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip) const;
 
+
+          /*
+           * Trivial class, used to ensure that mFlinger->onLayerDestroyed(mLayer)
+           * is called.
+           */
+          class LayerCleaner {
+              sp<SurfaceFlinger> mFlinger;
+              wp<LayerBase> mLayer;
+          protected:
+              ~LayerCleaner();
+          public:
+              LayerCleaner(const sp<SurfaceFlinger>& flinger,
+                      const sp<LayerBase>& layer);
+          };
+
+
+
                 sp<SurfaceFlinger> mFlinger;
 
 private:
@@ -323,64 +350,7 @@
     mutable     bool            mDebug;
 
 
-public:
-    // called from class SurfaceFlinger
-    virtual ~LayerBase();
-
 private:
-    LayerBase(const LayerBase& rhs);
-};
-
-
-// ---------------------------------------------------------------------------
-
-/*
- * This adds some additional fields and methods to support some Binder IPC
- * interactions.  In particular, the LayerBaseClient's lifetime can be
- * managed by references to an ISurface object in another process.
- */
-class LayerBaseClient : public LayerBase
-{
-public:
-    LayerBaseClient(SurfaceFlinger* flinger, const sp<Client>& client);
-
-    virtual ~LayerBaseClient();
-
-    // Creates an ISurface associated with this object.  This may only be
-    // called once (see also getSurfaceBinder()).
-    sp<ISurface> getSurface();
-
-    // Returns the Binder object for the ISurface associated with
-    // this object.
-    wp<IBinder> getSurfaceBinder() const;
-
-    virtual wp<IBinder> getSurfaceTextureBinder() const;
-
-    virtual sp<LayerBaseClient> getLayerBaseClient() const {
-        return const_cast<LayerBaseClient*>(this); }
-
-    virtual const char* getTypeId() const { return "LayerBaseClient"; }
-
-protected:
-    virtual void dump(String8& result, char* scratch, size_t size) const;
-    virtual void shortDump(String8& result, char* scratch, size_t size) const;
-
-    /*
-     * Trivial class, used to ensure that mFlinger->onLayerDestroyed(mLayer)
-     * is called.
-     */
-    class LayerCleaner {
-        sp<SurfaceFlinger> mFlinger;
-        wp<LayerBaseClient> mLayer;
-    protected:
-        ~LayerCleaner();
-    public:
-        LayerCleaner(const sp<SurfaceFlinger>& flinger,
-                const sp<LayerBaseClient>& layer);
-    };
-
-private:
-    virtual sp<ISurface> createSurface();
 
     mutable Mutex mLock;
 
@@ -391,6 +361,14 @@
     wp<IBinder> mClientSurfaceBinder;
 
     const wp<Client> mClientRef;
+
+
+public:
+    // called from class SurfaceFlinger
+    virtual ~LayerBase();
+
+private:
+    LayerBase(const LayerBase& rhs);
 };
 
 // ---------------------------------------------------------------------------
