diff --git a/src/org/briarproject/qrtest/CameraView.java b/src/org/briarproject/qrtest/CameraView.java
index 3bd7ace579726dfc33ebc766c42e512a5f87f47a..0fb0a9351b871eb8482cb5a0c3d26868fadd4bff 100644
--- a/src/org/briarproject/qrtest/CameraView.java
+++ b/src/org/briarproject/qrtest/CameraView.java
@@ -4,6 +4,7 @@ import static android.hardware.Camera.CameraInfo.CAMERA_FACING_FRONT;
 import static android.hardware.Camera.Parameters.FOCUS_MODE_AUTO;
 import static android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE;
 import static android.hardware.Camera.Parameters.FOCUS_MODE_MACRO;
+import static android.hardware.Camera.Parameters.SCENE_MODE_BARCODE;
 import static android.view.SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS;
 
 import java.io.IOException;
@@ -15,7 +16,6 @@ import android.hardware.Camera.AutoFocusCallback;
 import android.hardware.Camera.CameraInfo;
 import android.hardware.Camera.Parameters;
 import android.hardware.Camera.Size;
-import android.os.Handler;
 import android.util.Log;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
@@ -26,44 +26,38 @@ AutoFocusCallback {
 
 	private static String TAG = CameraView.class.getPackage().getName();
 
-	private final Handler handler;
-
 	private Camera camera = null;
 	private PreviewConsumer previewConsumer = null;
 	private Size desiredSize = null;
 	private int displayOrientation = 0;
-	private boolean stopped = false, autoFocus = false, surfaceExists = false;
+	private boolean autoFocus = false, surfaceExists = false;
 
 	public CameraView(Context context) {
 		super(context);
-		handler = new Handler();
 		setKeepScreenOn(true);
 	}
 
 	void start(Camera camera, PreviewConsumer previewConsumer,
-			int rotationDegrees, boolean macro) {
-		stopped = false;
+			int rotationDegrees) {
 		this.camera = camera;
 		this.previewConsumer = previewConsumer;
 		setDisplayOrientation(rotationDegrees);
-		setFocusMode(macro);
+		setFocusMode();
 		SurfaceHolder holder = getHolder();
-		holder.addCallback(this);
 		holder.setType(SURFACE_TYPE_PUSH_BUFFERS); // Required on Android < 3.0
 		if(surfaceExists) startPreview(holder);
+		else holder.addCallback(this);
 	}
 
 	void stop() {
-		stopped = true;
 		stopPreview();
-		getHolder().removeCallback(this);
 	}
 
 	private void startPreview(SurfaceHolder holder) {
 		try {
 			camera.setPreviewDisplay(holder);
 			camera.startPreview();
-			autoFocus();
+			if(autoFocus) camera.autoFocus(this);
 			previewConsumer.start(camera);
 		} catch(IOException e) {
 			Log.e(TAG, "Error starting camera preview", e);
@@ -80,10 +74,6 @@ AutoFocusCallback {
 		}
 	}
 
-	private void autoFocus() {
-		if(!stopped && autoFocus) camera.autoFocus(this);
-	}
-
 	private void setDisplayOrientation(int rotationDegrees) {
 		int orientation;
 		CameraInfo info = new CameraInfo();
@@ -99,26 +89,36 @@ AutoFocusCallback {
 		displayOrientation = orientation;
 	}
 
-	private void setFocusMode(boolean macro) {
+	private void setFocusMode() {
 		Parameters params = camera.getParameters();
-		List<String> modes = params.getSupportedFocusModes();
-		if(macro && modes.contains(FOCUS_MODE_MACRO)) {
-			Log.d(TAG, "Setting focus mode to macro");
-			params.setFocusMode(FOCUS_MODE_MACRO);
-			autoFocus = true;
-		} else if(modes.contains(FOCUS_MODE_CONTINUOUS_PICTURE)) {
-			Log.d(TAG, "Setting focus mode to continuous");
-			params.setFocusMode(FOCUS_MODE_CONTINUOUS_PICTURE);
-			autoFocus = false;
-		} else if(modes.contains(FOCUS_MODE_AUTO)) {
-			Log.d(TAG, "Setting focus mode to auto");
-			params.setFocusMode(FOCUS_MODE_AUTO);
-			autoFocus = true;
+		// This returns null on the HTC Wildfire S
+		List<String> modes = params.getSupportedSceneModes();
+		if(modes != null && modes.contains(SCENE_MODE_BARCODE)) {
+			Log.d(TAG, "Setting scene mode to barcode");
+			params.setSceneMode(SCENE_MODE_BARCODE);
 		} else {
-			Log.d(TAG, "No suitable focus mode");
-			autoFocus = false;
+			modes = params.getSupportedFocusModes();
+			if(modes.contains(FOCUS_MODE_MACRO)) {
+				Log.d(TAG, "Setting focus mode to macro");
+				params.setFocusMode(FOCUS_MODE_MACRO);
+				autoFocus = true;
+			} else if(modes.contains(FOCUS_MODE_CONTINUOUS_PICTURE)) {
+				Log.d(TAG, "Setting focus mode to continuous");
+				params.setFocusMode(FOCUS_MODE_CONTINUOUS_PICTURE);
+			} else if(modes.contains(FOCUS_MODE_AUTO)) {
+				Log.d(TAG, "Setting focus mode to auto");
+				params.setFocusMode(FOCUS_MODE_AUTO);
+				autoFocus = true;
+			} else {
+				Log.d(TAG, "No suitable focus mode");
+			}
+		}
+		params.setZoom(0);
+		try {
+			camera.setParameters(params);
+		} catch(Exception e) {
+			Log.e(TAG, "Error setting camera parameters", e);
 		}
-		camera.setParameters(params);
 	}
 
 	public void surfaceCreated(SurfaceHolder holder) {
@@ -165,11 +165,6 @@ AutoFocusCallback {
 
 	public void onAutoFocus(boolean success, final Camera camera) {
 		Log.d(TAG, "Auto focus: " + success);
-		handler.postDelayed(new Runnable() {
-			public void run() {
-				autoFocus();
-			}
-		}, success ? 3000 : 0);
 	}
 
 	@Override
diff --git a/src/org/briarproject/qrtest/QrTestActivity.java b/src/org/briarproject/qrtest/QrTestActivity.java
index d1b957e204798eef9416ce5aed672084e09f2531..3373f782d70c33962b45d55fbddde8df5d3fce02 100644
--- a/src/org/briarproject/qrtest/QrTestActivity.java
+++ b/src/org/briarproject/qrtest/QrTestActivity.java
@@ -7,7 +7,6 @@ import static android.view.Gravity.CENTER;
 import static android.view.View.GONE;
 import static android.view.View.VISIBLE;
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
-import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
 import static android.widget.ImageView.ScaleType.FIT_CENTER;
 import static android.widget.LinearLayout.HORIZONTAL;
 import static android.widget.LinearLayout.VERTICAL;
@@ -28,6 +27,7 @@ implements QrCodeDecoder.ResultCallback {
 
 	private static String TAG = QrTestActivity.class.getPackage().getName();
 
+	private QrCodeDecoder decoder = null;
 	private CameraView cameraView = null;
 	private LinearLayout cameraBorder = null;
 	private ImageView tickView = null;
@@ -38,6 +38,8 @@ implements QrCodeDecoder.ResultCallback {
 	protected void onCreate(Bundle state) {
 		super.onCreate(state);
 
+		decoder = new QrCodeDecoder(this);
+
 		setRequestedOrientation(SCREEN_ORIENTATION_NOSENSOR);
 
 		cameraView = new CameraView(this);
@@ -52,16 +54,16 @@ implements QrCodeDecoder.ResultCallback {
 		tickView.setImageResource(R.drawable.tick);
 		tickView.setScaleType(FIT_CENTER);
 		tickView.setBackgroundColor(WHITE);
-		tickView.setLayoutParams(new LayoutParams(WRAP_CONTENT,
-				WRAP_CONTENT, 1));
+		tickView.setLayoutParams(new LayoutParams(MATCH_PARENT,
+				MATCH_PARENT, 1));
 		tickView.setVisibility(GONE);
 
 		ImageView qrCodeView = new ImageView(this);
 		qrCodeView.setImageResource(R.drawable.test_code_62_chars);
 		qrCodeView.setScaleType(FIT_CENTER);
 		qrCodeView.setBackgroundColor(WHITE);
-		qrCodeView.setLayoutParams(new LayoutParams(WRAP_CONTENT,
-				WRAP_CONTENT, 1));
+		qrCodeView.setLayoutParams(new LayoutParams(MATCH_PARENT,
+				MATCH_PARENT, 1));
 
 		Display display = getWindowManager().getDefaultDisplay();
 		boolean portrait = display.getWidth() < display.getHeight();
@@ -91,7 +93,7 @@ implements QrCodeDecoder.ResultCallback {
 		Log.d(TAG, "Opening camera");
 		try {
 			camera = Camera.open();
-			cameraView.start(camera, new QrCodeDecoder(this), 0, true);
+			cameraView.start(camera, decoder, 0);
 		} catch(Exception e) {
 			Log.e(TAG, "Error opening camera", e);
 			finish();