diff --git a/archive.js b/archive.js
index 9546c86411cb999bada6b8e083fe6b51ce3e0b45..6844e6ed7bc09e27f0199607fcb913efaa037498 100755
--- a/archive.js
+++ b/archive.js
@@ -290,24 +290,48 @@ function setDate()
 
 	document.getElementById("nav-dayname").firstChild.data = days[d.getDay()];
 
-	var image = d.getFullYear()+zPad((d.getMonth()+1).toString())+"/"+zPad(d.getDate().toString())+"/"+zPad(d.getHours().toString())+"/"+zPad(d.getMinutes().toString())+".jpg";
-	updateWebcam ("webcam1", "/archive/colour/" + image);
-	//updateWebcam ("webcam1-datetime", "/archive/colour/" + image);
-	updateWebcam ("webcam2", "/archive/colour1/" + image);
-	updateWebcam ("webcam3", "/archive/colour3/" + image);
-	updateWebcam ("webcam4", "/archive/bw/" + image);
-	updateWebcam ("uvc1", "/archive/uvc1/" + image);
-	updateWebcam ("ipcamera1", "/archive/ipcamera1/" + image);
-	updateWebcam ("ipcamera2", "/archive/ipcamera2/" + image);
-	updateWebcam ("ipcamera3", "/archive/ipcamera3/" + image);
-	updateWebcam ("ipcamera4", "/archive/ipcamera4/" + image);
-	updateWebcam ("ipcamera5", "/archive/ipcamera5/" + image);
-	updateWebcam ("ipcamera6", "/archive/ipcamera6/" + image);
-	updateWebcam ("ipcamera9", "/archive/ipcamera9/" + image);
-	updateWebcam ("ipcamera10", "/archive/ipcamera10/" + image);
-	updateWebcam ("ipcamera7", "/archive/ipcamera7/" + image);
-        updateWebcam ("ipcamera8", "/archive/ipcamera8/" + image);
-	//setTimeout("clearText()",1000);
+	if( false )
+	{
+		var image = d.getFullYear()+zPad((d.getMonth()+1).toString())+"/"+zPad(d.getDate().toString())+"/"+zPad(d.getHours().toString())+"/"+zPad(d.getMinutes().toString())+".jpg";
+		updateWebcam ("webcam1", "/archive/colour/" + image);
+		//updateWebcam ("webcam1-datetime", "/archive/colour/" + image);
+		updateWebcam ("webcam2", "/archive/colour1/" + image);
+		updateWebcam ("webcam3", "/archive/colour3/" + image);
+		updateWebcam ("webcam4", "/archive/bw/" + image);
+		updateWebcam ("uvc1", "/archive/uvc1/" + image);
+		updateWebcam ("ipcamera1", "/archive/ipcamera1/" + image);
+		updateWebcam ("ipcamera2", "/archive/ipcamera2/" + image);
+		updateWebcam ("ipcamera3", "/archive/ipcamera3/" + image);
+		updateWebcam ("ipcamera4", "/archive/ipcamera4/" + image);
+		updateWebcam ("ipcamera5", "/archive/ipcamera5/" + image);
+		updateWebcam ("ipcamera6", "/archive/ipcamera6/" + image);
+		updateWebcam ("ipcamera9", "/archive/ipcamera9/" + image);
+		updateWebcam ("ipcamera10", "/archive/ipcamera10/" + image);
+		updateWebcam ("ipcamera7", "/archive/ipcamera7/" + image);
+		updateWebcam ("ipcamera8", "/archive/ipcamera8/" + image);
+		//setTimeout("clearText()",1000);
+	}
+	else
+	{
+		var timestamp = d.getFullYear()+zPad((d.getMonth()+1).toString())+zPad(d.getDate().toString())+"-"+zPad(d.getHours().toString())+zPad(d.getMinutes().toString());
+		updateWebcam ("webcam1", "archive.php?camera=colour&timestamp=" + timestamp);
+		//updateWebcam ("webcam1-datetime", "archive.php?camera=colour&timestamp=" + image);
+		updateWebcam ("webcam2", "archive.php?camera=colour1&timestamp=" + timestamp);
+		updateWebcam ("webcam3", "archive.php?camera=colour3&timestamp=" + timestamp);
+		updateWebcam ("webcam4", "archive.php?camera=bw&timestamp=" + timestamp);
+		updateWebcam ("uvc1"   , "archive.php?camera=uvc1&timestamp=" + timestamp);
+		updateWebcam ("ipcamera1", "archive.php?camera=ipcamera1&timestamp=" + timestamp);
+		updateWebcam ("ipcamera2", "archive.php?camera=ipcamera2&timestamp=" + timestamp);
+		updateWebcam ("ipcamera3", "archive.php?camera=ipcamera3&timestamp=" + timestamp);
+		updateWebcam ("ipcamera4", "archive.php?camera=ipcamera4&timestamp=" + timestamp);
+		updateWebcam ("ipcamera5", "archive.php?camera=ipcamera5&timestamp=" + timestamp);
+		updateWebcam ("ipcamera6", "archive.php?camera=ipcamera6&timestamp=" + timestamp);
+		updateWebcam ("ipcamera9", "archive.php?camera=ipcamera9&timestamp=" + timestamp);
+		updateWebcam ("ipcamera10", "archive.php?camera=ipcamera10&timestamp=" + timestamp);
+		updateWebcam ("ipcamera7", "archive.php?camera=ipcamera7&timestamp=" + timestamp);
+		updateWebcam ("ipcamera8", "archive.php?camera=ipcamera8&timestamp=" + timestamp);
+		//setTimeout("clearText()",1000);
+	}
 }
 
 function setMinutes(mins)
diff --git a/archive.php b/archive.php
old mode 100755
new mode 100644
index f1841897a4f2a429574db90edee796ce088d42e9..bbdd5e101934167108c04536e38b4012aa876c12
--- a/archive.php
+++ b/archive.php
@@ -25,17 +25,42 @@
 		"uvc1",
 	);
 
-	$camera = ($_GET['camera']?$_GET['camera']:'nocamera');
+	$camera = (isset($_GET['camera']) ? $_GET['camera'] : 'nocamera');
+	$timestamp = (isset($_GET['timestamp']) ? DateTime::createFromFormat("Ymd-Hi", $_GET['timestamp']) : null);
 
 	// check camera is approved - mtearle
 	if (!in_array($camera,$approved))
 		$camera = 'nocamera';
 
-	$imagelocation="archive/";
-	$file = $imagelocation.strtolower($camera).".jpg";
-	header("Expires: ".gmdate("D, d M Y H:i:s", time())." GMT");
+	if( $timestamp === FALSE ) {
+		$file = "nocamera.jpg";
+	}
+	else if( $timestamp === null ) {
+		$file = "../".strtolower($camera).".jpg";
+		header("Expires: ".gmdate("D, d M Y H:i:s", time())." GMT");
+	}
+	else {
+		$month_folder = "archive/" . $camera . "/" . $timestamp->format("Ym") . "/";
+		$vid_file = $month_folder . $timestamp->format("Ymd").".mkv";
+		//header("X-WebcamVideo: {$vid_file}");
+		if( is_readable($vid_file) ) {
+			// A video for this day exists.
+			$frame = ($timestamp->format("H") + 0) * 60 + ($timestamp->format("i") + 0);
+			header("Content-Type: image/jpeg");
+			header("Last-Modified: ".gmdate("D, d M Y H:i:s", filectime($vid_file))." GMT");
+			$cmd = "ffmpeg -loglevel fatal -i {$vid_file} -vf select='eq(n\,{$frame})' -f singlejpeg -";
+			//header("X-WebcamCommmand: {$cmd}");
+			passthru($cmd);
+			exit();
+		}
+		$file = $month_folder . $timestamp->format("d/H/") . $timestamp->format("i").".jpg";
+		//header("X-WebcamFile: {$file}");
+	}
+	// If the image isn't available, emit "nocamera.jpg" with a 404 code
+	// - The 404 makes the archive.html page work properly
 	if (!is_readable($file)) {
-		$file="nocamera.jpg";
+		http_response_code("404");
+		$file = "nocamera.jpg";
 	}
 	header("Content-Type: image/jpeg");
 	header("Content-Length: ".filesize($file));