diff --git a/extras/src/main/java/edu/umd/cs/piccolox/util/ShadowUtils.java b/extras/src/main/java/edu/umd/cs/piccolox/util/ShadowUtils.java
index 49ef01f..f1b5b6a 100755
--- a/extras/src/main/java/edu/umd/cs/piccolox/util/ShadowUtils.java
+++ b/extras/src/main/java/edu/umd/cs/piccolox/util/ShadowUtils.java
@@ -51,20 +51,21 @@
         // empty
     }
 
-
     /**
-     * Create and return a new buffered image containing a shadow of the specified source image
-     * using the specifed shadow paint and gaussian blur radius.  The dimensions of the returned image will be
-     * src.getWidth() + 4 * blurRadius x src.getHeight() + 4 * blurRadius
-     * to account for blurring beyond the bounds of the source image.  Thus the source image
-     * will appear to be be offset by (2 * blurRadius, 2 * blurRadius)
-     * in the returned image.
-     *
+     * Create and return a new buffered image containing a shadow of the
+     * specified source image using the specifed shadow paint and gaussian blur
+     * radius. The dimensions of the returned image will be
+     * src.getWidth() + 4 * blurRadius x
+     * src.getHeight() + 4 * blurRadius to account for blurring
+     * beyond the bounds of the source image. Thus the source image will appear
+     * to be be offset by (2 * blurRadius,
+     * 2 * blurRadius) in the returned image.
+     * 
      * @param src source image, must not be null
      * @param shadowPaint shadow paint
      * @param blurRadius gaussian blur radius, must be > 0
-     * @return a new buffered image containing a shadow of the specified source image
-     *   using the specifed shadow paint and gaussian blur radius
+     * @return a new buffered image containing a shadow of the specified source
+     *         image using the specifed shadow paint and gaussian blur radius
      */
     public static BufferedImage createShadow(final Image src, final Paint shadowPaint, final int blurRadius) {
         if (src == null) {
@@ -100,19 +101,20 @@
 
         /**
          * Create a new gaussian kernel with the specified blur radius.
-         *
+         * 
          * @param blurRadius blur radius
          */
         GaussianKernel(final int blurRadius) {
             super((2 * blurRadius) + 1, (2 * blurRadius) + 1, createKernel(blurRadius));
         }
 
-
         /**
-         * Create an array of floats representing a gaussian kernel with the specified radius.
-         *
+         * Create an array of floats representing a gaussian kernel with the
+         * specified radius.
+         * 
          * @param r radius
-         * @return an array of floats representing a gaussian kernel with the specified radius
+         * @return an array of floats representing a gaussian kernel with the
+         *         specified radius
          */
         private static float[] createKernel(final int r) {
             int w = (2 * r) + 1;
@@ -121,16 +123,17 @@
             double n = Math.PI * m;
 
             double sum = 0.0d;
-            for (int i = 0; i < w; i++) {
-                for (int j = 0; j < w; j++) {
-                    kernel[i * w + j] = (float) (Math.pow(Math.E, -((j - r) * (j - r) + (i - r) * (i - r)) / m) / n);
-                    sum += kernel[i * w + j];
+            for (int x = 0; x < w; x++) {
+                int xr2 = (x-r) * (x-r);                
+                for (int y = 0; y < w; y++) {
+                    int yr2 = (y-r) * (y-r);
+                    kernel[x * w + y] = (float) (Math.pow(Math.E, -(yr2 + xr2) / m) / n);
+                    sum += kernel[x * w + y];
                 }
             }
-            for (int i = 0; i < w; i++) {
-                for (int j = 0; j < w; j++) {
-                    kernel[i * w + j] /= sum;
-                }
+
+            for (int i = kernel.length - 1; i >= 0; i--) {
+                kernel[i] /= sum;
             }
             return kernel;
         }
diff --git a/extras/src/test/java/edu/umd/cs/piccolox/PAppletTest.java b/extras/src/test/java/edu/umd/cs/piccolox/PAppletTest.java
new file mode 100644
index 0000000..ef27c50
--- /dev/null
+++ b/extras/src/test/java/edu/umd/cs/piccolox/PAppletTest.java
@@ -0,0 +1,26 @@
+package edu.umd.cs.piccolox;
+
+import junit.framework.TestCase;
+import edu.umd.cs.piccolo.PCanvas;
+
+public class PAppletTest extends TestCase {
+    private PApplet applet;
+    
+    public void setUp() {
+        applet = new PApplet();
+        applet.init();
+        applet.setVisible(false);        
+    }
+    
+    public void tearDown() {       
+        applet.setVisible(false);
+    }
+    
+    public void testCanvasIsValidWithDefaultConstructor() {        
+        PCanvas canvas = applet.getCanvas();
+        assertNotNull(canvas);
+        assertNotNull(canvas.getLayer());
+        assertNotNull(canvas.getCamera());
+        assertSame(canvas.getLayer(), canvas.getCamera().getLayer(0));       
+    }   
+}
diff --git a/extras/src/test/java/edu/umd/cs/piccolox/PFrameTest.java b/extras/src/test/java/edu/umd/cs/piccolox/PFrameTest.java
new file mode 100644
index 0000000..b906e9b
--- /dev/null
+++ b/extras/src/test/java/edu/umd/cs/piccolox/PFrameTest.java
@@ -0,0 +1,46 @@
+package edu.umd.cs.piccolox;
+
+import java.awt.event.KeyListener;
+
+import junit.framework.TestCase;
+import edu.umd.cs.piccolo.PCanvas;
+
+public class PFrameTest extends TestCase {
+    private PFrame frame;   
+
+    public void testCanvasIsValidWithDefaultConstructor() {
+        PFrame frame = new PFrame() {
+            public void setVisible(boolean visible) {
+                // why oh why is PFrame visible by default
+            }
+        };
+        PCanvas canvas = frame.getCanvas();
+        assertNotNull(canvas);
+        assertNotNull(canvas.getLayer());
+        assertNotNull(canvas.getCamera());
+        assertSame(canvas.getLayer(), canvas.getCamera().getLayer(0));
+    }
+
+    public void testDefaultsToWindowed() {
+        PFrame frame = new PFrame() {
+            public void setVisible(boolean visible) {
+                // why oh why is PFrame visible by default
+            }
+        };
+        assertFalse(frame.isFullScreenMode());
+    }
+
+    public void testFullScreenModeInstallsEscapeListeners() {
+        PFrame frame = new PFrame();        
+        frame.setFullScreenMode(true);        
+        
+
+        KeyListener[] listeners = frame.getCanvas().getKeyListeners();
+        assertEquals(1, listeners.length);
+
+        KeyListener listener = listeners[0];
+        assertNotNull(listener);
+        frame.setVisible(false);
+        frame.setFullScreenMode(false);
+    }
+}
diff --git a/extras/src/test/java/edu/umd/cs/piccolox/nodes/PShadowTest.java b/extras/src/test/java/edu/umd/cs/piccolox/nodes/PShadowTest.java
index 8739373..3b8e175 100755
--- a/extras/src/test/java/edu/umd/cs/piccolox/nodes/PShadowTest.java
+++ b/extras/src/test/java/edu/umd/cs/piccolox/nodes/PShadowTest.java
@@ -40,43 +40,26 @@
  * Unit test for PShadow.
  */
 public final class PShadowTest extends TestCase {
+    private static final int TEST_IMAGE_WIDTH = 25;
+    private static final int TEST_IMAGE_HEIGHT = 10;
+    private BufferedImage src;
+    private Color shadowPaint;
 
-    public void testConstructor() {
-        BufferedImage src = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
+    public void setUp() {
+        shadowPaint = new Color(20, 20, 20, 200);
+        src = new BufferedImage(TEST_IMAGE_WIDTH, TEST_IMAGE_HEIGHT, BufferedImage.TYPE_INT_ARGB);
         Paint srcPaint = new Color(255, 0, 0, 200);
-        Paint shadowPaint = new Color(20, 20, 20, 200);
+
         Graphics2D g = src.createGraphics();
         g.setPaint(srcPaint);
         g.drawRect(25, 25, 50, 50);
         g.dispose();
+    }
 
-        for (int blurRadius = 1; blurRadius < 33; blurRadius += 4) {
-            PShadow shadowNode = new PShadow(src, shadowPaint, blurRadius);
-            assertNotNull(shadowNode);
-            assertEquals(src.getWidth() + 4 * blurRadius, shadowNode.getWidth(), 0.001d);
-            assertEquals(src.getHeight() + 4 * blurRadius, shadowNode.getHeight(), 0.001d);
-        }
-
-        try {
-            new PShadow(null, shadowPaint, 4);
-            fail("ctr(null, ...) expected IllegalArgumentException");
-        }
-        catch (IllegalArgumentException e) {
-            // expected
-        }
-        try {
-            new PShadow(src, shadowPaint, 0);
-            fail("ctr(..., -1) expected IllegalArgumentException");
-        }
-        catch (IllegalArgumentException e) {
-            // expected
-        }
-        try {
-            new PShadow(src, shadowPaint, -1);
-            fail("ctr(..., -1) expected IllegalArgumentException");
-        }
-        catch (IllegalArgumentException e) {
-            // expected
-        }
+    public void testShadowCreatesCorrectImageSize() {
+        PShadow shadowNode = new PShadow(src, shadowPaint, 4);
+        assertNotNull(shadowNode);
+        assertEquals(TEST_IMAGE_WIDTH + 16, shadowNode.getWidth(), 0.001d);
+        assertEquals(TEST_IMAGE_HEIGHT + 16, shadowNode.getHeight(), 0.001d);
     }
 }
\ No newline at end of file
diff --git a/extras/src/test/java/edu/umd/cs/piccolox/util/ShadowUtilsTest.java b/extras/src/test/java/edu/umd/cs/piccolox/util/ShadowUtilsTest.java
index fb97617..407cb3c 100755
--- a/extras/src/test/java/edu/umd/cs/piccolox/util/ShadowUtilsTest.java
+++ b/extras/src/test/java/edu/umd/cs/piccolox/util/ShadowUtilsTest.java
@@ -31,52 +31,69 @@
 import java.awt.Color;
 import java.awt.Graphics2D;
 import java.awt.Paint;
-
 import java.awt.image.BufferedImage;
 
+import edu.umd.cs.piccolox.nodes.PShadow;
+
 import junit.framework.TestCase;
 
 /**
  * Unit test for ShadowUtils.
  */
 public final class ShadowUtilsTest extends TestCase {
+    private static final int TEST_IMAGE_SIZE = 25;
+    private static final Paint shadowPaint = new Color(20, 20, 20, 200);
+    private BufferedImage src;
 
-    public void testCreateShadow() {
-        BufferedImage src = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
+    public void setUp() {
+        src = new BufferedImage(TEST_IMAGE_SIZE, TEST_IMAGE_SIZE, BufferedImage.TYPE_INT_ARGB);
         Paint srcPaint = new Color(255, 0, 0, 200);
-        Paint shadowPaint = new Color(20, 20, 20, 200);
         Graphics2D g = src.createGraphics();
         g.setPaint(srcPaint);
         g.drawRect(25, 25, 50, 50);
         g.dispose();
+    }
 
-        for (int blurRadius = 1; blurRadius < 33; blurRadius += 4) {
-            BufferedImage dest = ShadowUtils.createShadow(src, shadowPaint, blurRadius);
-            assertNotNull(dest);
-            assertEquals(src.getWidth() + 4 * blurRadius, dest.getWidth());
-            assertEquals(src.getHeight() + 4 * blurRadius, dest.getHeight());
-        }
+    public void testCreateShadowAcceptsTinyShadow() {
+        BufferedImage dest = ShadowUtils.createShadow(src, shadowPaint, 1);
+        assertNotNull(dest);
+        assertEquals(TEST_IMAGE_SIZE + 4, dest.getWidth());
+        assertEquals(TEST_IMAGE_SIZE + 4, dest.getHeight());
+    }
 
-        try {
-            ShadowUtils.createShadow(null, shadowPaint, 4);
-            fail("createShadow(null, ...) expected IllegalArgumentException");
-        }
-        catch (IllegalArgumentException e) {
-            // expected
-        }
+    public void testCreateShadowAcceptsHugeShadow() {
+        BufferedImage dest = ShadowUtils.createShadow(src, shadowPaint, 25);
+        assertNotNull(dest);
+        assertEquals(TEST_IMAGE_SIZE + 100, dest.getWidth());
+        assertEquals(TEST_IMAGE_SIZE + 100, dest.getHeight());
+    }
+
+    public void testNonPositiveBlurRadiusFails() {
         try {
             ShadowUtils.createShadow(src, shadowPaint, 0);
-            fail("createShadow(..., 0) expected IllegalArgumentException");
+            fail("Non positive blur radius should fail");
         }
         catch (IllegalArgumentException e) {
             // expected
         }
+
         try {
             ShadowUtils.createShadow(src, shadowPaint, -1);
-            fail("createShadow(..., -1) expected IllegalArgumentException");
+            fail("Non positive blur radius should fail");
         }
         catch (IllegalArgumentException e) {
             // expected
         }
     }
+
+    public void testConstructorDoesNotAcceptNullSrc() {
+        try {
+            ShadowUtils.createShadow(null, Color.BLACK, 4);
+            fail("ctr(null, ...) expected IllegalArgumentException");
+        }
+        catch (IllegalArgumentException e) {
+            // expected
+        }
+    }
+
 }
\ No newline at end of file