diff --git a/971CV/src/org/frc971/VisionTuner.java b/971CV/src/org/frc971/VisionTuner.java
new file mode 100644
index 0000000..7ecd98a
--- /dev/null
+++ b/971CV/src/org/frc971/VisionTuner.java
@@ -0,0 +1,120 @@
+package org.frc971;
+
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.io.IOException;
+
+import javax.imageio.ImageIO;
+import javax.swing.WindowConstants;
+
+import com.googlecode.javacv.CanvasFrame;
+
+import edu.wpi.first.wpijavacv.WPIColorImage;
+
+/* REQUIRED JAVA LIBRARIES:
+ *   Program Files/SmartDashboard/
+ *     extensions/lib/javacpp.jar
+ *     extensions/lib/javacv-YOUR_OS.jar
+ *     extensions/lib/javacv.jar
+ *     extensions/lib/WPIJavaCV.jar
+ *     SmartDashboard.jar                 -- maybe in the future
+ *     extensions/WPICameraExtension.jar  -- maybe in the future
+ *
+ * REQUIRED NATIVE CODE LIBRARIES:
+ *   Program Files/WPIJavaCV/
+ *     JavaCV_2.2.0/javacv-bin/javacv-YOUR_OS.jar
+ *     OpenCV_2.2.0/bin/*
+ */
+/**
+ * FRC 2013 vision-target recognizer tuner app.
+ *
+ * @author jerry
+ */
+public class VisionTuner {
+    private String[] testImageFilenames;
+    private WPIColorImage[] testImages;
+    private final CanvasFrame cameraFrame = new CanvasFrame("Camera");
+    private int currentIndex = 0;
+
+    public VisionTuner(String[] imageFilenames) {
+        cameraFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+        cameraFrame.setFocusable(true);
+        cameraFrame.requestFocus();
+
+        loadTestImages(imageFilenames);
+    }
+
+
+    /**
+     * Loads the named test image files.
+     * Sets testImageFilenames and testImages.
+     */
+    private void loadTestImages(String[] imageFilenames) {
+	testImageFilenames = imageFilenames;
+	testImages = new WPIColorImage[testImageFilenames.length];
+
+	for (int i = 0; i < testImageFilenames.length; i++) {
+            String imageFilename = testImageFilenames[i];
+
+            System.out.println("Loading image file: " + imageFilename);
+            WPIColorImage rawImage = null;
+            try {
+                rawImage = new WPIColorImage(ImageIO.read(new File(imageFilename)));
+            } catch (IOException e) {
+                System.err.println("Couldn't load image file: " + imageFilename + ": " + e.getMessage());
+                System.exit(1);
+                return;
+            }
+            testImages[i] = rawImage;
+	}
+    }
+
+    private void processCurrentImage() {
+        WPIColorImage rawImage = testImages[currentIndex];
+        cameraFrame.showImage(rawImage.getBufferedImage());
+        cameraFrame.setTitle(testImageFilenames[currentIndex]);
+    }
+
+    private void previousImage() {
+	if (currentIndex > 0) {
+	    --currentIndex;
+	}
+	processCurrentImage();
+    }
+
+    private void nextImage() {
+	if (currentIndex + 1 < testImages.length) {
+	    ++currentIndex;
+	}
+	processCurrentImage();
+    }
+
+    private void processEvents() {
+	KeyEvent e = cameraFrame.waitKey();
+
+	switch (e.getKeyCode()) {
+	case KeyEvent.VK_LEFT:
+	    previousImage();
+	    break;
+	case KeyEvent.VK_RIGHT:
+	    nextImage();
+	    break;
+	}
+    }
+
+    public static void main(final String[] args) {
+        if (args.length == 0) {
+            System.err.println("Usage: " + VisionTuner.class.getName()
+        	    + " test image filenames...");
+            System.exit(1);
+        }
+
+        VisionTuner tuner = new VisionTuner(args);
+        tuner.processCurrentImage();
+
+        for (;;) {
+            tuner.processEvents();
+        }
+    }
+
+}
