diff --git a/src/org/zeroxlab/graphics/DrawArcView.java b/src/org/zeroxlab/graphics/DrawArcView.java
index d05cfa9..4566e1f 100644
--- a/src/org/zeroxlab/graphics/DrawArcView.java
+++ b/src/org/zeroxlab/graphics/DrawArcView.java
@@ -55,18 +55,29 @@
     }
 
     private void drawArc(Canvas canvas) {
-        int color = (0x00252525 | new Random().nextInt() ) | Color.BLACK; 
+        if (angle > 360) angle = 0;
+
+        int color = (0x00252525 | new Random().nextInt() ) | Color.BLACK;
         Paint p = new Paint();
         p.setAntiAlias(false);
         p.setStyle(Paint.Style.FILL);
         p.setColor(color);
 
-        canvas.drawArc(new RectF(0,0, getWidth(), getHeight()), 0, angle, center, p);
-        center = !center;
-        angle += step;
-        if (angle >= 360) {
-            angle = 0;
+        canvas.drawArc(new RectF(0,0, getWidth(), getHeight()), 0, angle, true, p);
+
+        for(int j=0; j<3; j++) for(int x=0; x<4; x++) for(int y=0; y<4; y++) {
+            color = (0x88252525 | new Random().nextInt() );
+            p = new Paint();
+            p.setAntiAlias(false);
+            p.setStyle(Paint.Style.FILL);
+            p.setColor(color);
+
+            if(x%2==0)
+                canvas.drawArc(new RectF( x*getWidth()/4, y*getHeight()/4, (1+x)*getWidth()/4, (1+y)*getHeight()/4), 0, angle, (x+y)%2 == 0, p);
+            else
+                canvas.drawArc(new RectF( x*getWidth()/4, y*getHeight()/4, (1+x)*getWidth()/4, (1+y)*getHeight()/4), 0, -angle, (x+y)%2 == 0, p);
         }
+        angle += step;
     }
 
     public DrawArcView(Context context, AttributeSet attrs) {
diff --git a/src/org/zeroxlab/graphics/DrawCircle2View.java b/src/org/zeroxlab/graphics/DrawCircle2View.java
index 62f8074..ee30b14 100644
--- a/src/org/zeroxlab/graphics/DrawCircle2View.java
+++ b/src/org/zeroxlab/graphics/DrawCircle2View.java
@@ -52,22 +52,26 @@
     }
 
     private void drawCircle(Canvas canvas) {
-        Random mRandom = new Random();
 
-        int color = (0x00252525 | mRandom.nextInt() ) | Color.BLACK; 
-        Paint p = new Paint();
-        p.setAntiAlias(false);
-        p.setStyle(Paint.Style.FILL);
-        p.setColor(color);
+        Random mRandom = new Random();
 
         int height = getHeight();
         int width  = getWidth();
 
         int cx = (int)((mRandom.nextInt() % (width*0.8) ) + (width*0.1));
         int cy = (int)((mRandom.nextInt() % (height*0.8) ) + (height*0.1));
-        int  r = (int)((mRandom.nextInt() % (width*0.4) ) + (width*0.1));
+        int  r = (int)((mRandom.nextInt() % (width*0.3) ) + (width*0.2));
 
-        canvas.drawCircle(cx, cy, r, p);
+        int color;
+        Paint p;
+        for(int i=6; i>=0; i--) {
+            color = (0x33252525 | mRandom.nextInt()); 
+            p = new Paint();
+            p.setAntiAlias(true);
+            p.setStyle(Paint.Style.FILL);
+            p.setColor(color);
+            canvas.drawCircle(cx, cy, (int)(r*(1 + i/10.0)), p);
+        }
     }
 
     public DrawCircle2View(Context context, AttributeSet attrs) {
diff --git a/src/org/zeroxlab/graphics/DrawImageView.java b/src/org/zeroxlab/graphics/DrawImageView.java
index f8bf15d..ac144ea 100644
--- a/src/org/zeroxlab/graphics/DrawImageView.java
+++ b/src/org/zeroxlab/graphics/DrawImageView.java
@@ -47,12 +47,16 @@
 
 class DrawImageView extends SurfaceView {
 
+    private final int COL = 5;
+    private final int ROW = 9;
+
     private SurfaceHolder mSurfaceHolder;
-    private int position[] = {0,0,0,0,0};
-    private boolean direction[] = {true,true,true,true,true};
+    private float position[] = new float[ROW];
+    private boolean direction[] = new boolean[ROW];
     private Bitmap mBitmap;
     private Paint bgPaint;
 
+
     protected void setImage(Bitmap bmp) {
         mBitmap = bmp;
     }
@@ -64,15 +68,18 @@
     }
 
     private void drawImage(Canvas canvas) {
-        canvas.drawRect(0,0,getWidth(),getHeight(),bgPaint);
+        int w = getWidth();
+        int h = getHeight();
+        canvas.drawRect(0,0,w,h,bgPaint);
 
-        for(int x=0; x<5; x++) {
+        for(int x=0; x<ROW; x++) {
             int speed = (x+1) * 2;
-
-            canvas.drawBitmap(mBitmap, (getWidth() - mBitmap.getWidth())/2, position[x], null);
+            
+            for(int j=0; j<COL; j++)
+                canvas.drawBitmap(mBitmap, null, new RectF((w/(float)COL)*j, position[x], (w/(float)COL)*(j+1), position[x]+(w/(float)COL)), null);
             if(direction[x]) {
                 position[x] += speed;
-                if (position[x] + mBitmap.getHeight() >= getHeight())
+                if (position[x] + (w/(float)COL) >= getHeight())
                     direction[x] = !direction[x];
             } else {
                 position[x] -= speed;
@@ -89,6 +96,11 @@
         bgPaint = new Paint();
         bgPaint.setColor(Color.BLACK);
         bgPaint.setStyle(Paint.Style.FILL);
+
+        for(int i=0; i<ROW; i++) {
+            position[i] = 0;
+            direction[i] = true;
+        }
     }
 }
 
diff --git a/src/org/zeroxlab/graphics/DrawTextView.java b/src/org/zeroxlab/graphics/DrawTextView.java
index 7238fcd..d125e77 100644
--- a/src/org/zeroxlab/graphics/DrawTextView.java
+++ b/src/org/zeroxlab/graphics/DrawTextView.java
@@ -45,6 +45,9 @@
 
     public final String TEXT1 = "0xbench";
     public final String TEXT2 = "0xlab";
+    public final int TIMES = 10;
+
+    private Paint bgPaint;
 
     class PaintText {
         public int x;
@@ -72,34 +75,43 @@
         Random mRandom = new Random();
         int height = getHeight();
         int width  = getWidth();
+        canvas.drawRect(0,0,width,height,bgPaint);
+       
+        int cx;
+        int cy;
+        int color; 
+        for(int i=0; i<TIMES; i++) {
+            cx = (int)((mRandom.nextInt() % (width*0.8) ) + (width*0.1));
+            cy = (int)((mRandom.nextInt() % (height*0.8) ) + (height*0.1));
 
-        int cx = (int)((mRandom.nextInt() % (width*0.8) ) + (width*0.1));
-        int cy = (int)((mRandom.nextInt() % (height*0.8) ) + (height*0.1));
+            color = (0x00555555 | mRandom.nextInt() ) | Color.BLACK; 
+            Paint p = new Paint();
+            p.setAntiAlias(true);
+            p.setStyle(Paint.Style.FILL);
+            p.setTextAlign(Paint.Align.CENTER);
 
-        int color = (0x00353535 | mRandom.nextInt() ) | Color.BLACK; 
-        Paint p = new Paint();
-        p.setAntiAlias(false);
-        p.setStyle(Paint.Style.FILL);
-        p.setTextAlign(Paint.Align.CENTER);
+            if(mRandom.nextInt()%2 == 0)
+                p.setFakeBoldText(true);
 
-        if(mRandom.nextInt()%2 == 0)
-            p.setFakeBoldText(true);
+            if(mRandom.nextInt()%2 == 0)
+                p.setTextSkewX((float)-0.45);
 
-        if(mRandom.nextInt()%2 == 0)
-            p.setTextSkewX((float)-0.35);
+            p.setColor(color);
+            p.setTextSize(42 + (mRandom.nextInt()%28));
 
-        p.setColor(color);
-        p.setTextSize(32 + (mRandom.nextInt()%24));
-
-        if(mRandom.nextInt()%2 == 0)
-            canvas.drawText(TEXT1, cx, cy, p);
-        else
-            canvas.drawText(TEXT2, cx, cy, p);
+            if(mRandom.nextInt()%2 == 0)
+                canvas.drawText(TEXT1, cx, cy, p);
+            else
+                canvas.drawText(TEXT2, cx, cy, p);
+        }
     }
 
     public DrawTextView(Context context, AttributeSet attrs) {
         super(context, attrs);
         mSurfaceHolder = getHolder();
+        bgPaint = new Paint();
+        bgPaint.setColor(Color.BLACK);
+        bgPaint.setStyle(Paint.Style.FILL);
     }
 }
 
