Index: /other-projects/nz-flag-design/trunk/design-2d/image-data-to-file.jsp
===================================================================
--- /other-projects/nz-flag-design/trunk/design-2d/image-data-to-file.jsp	(revision 29607)
+++ /other-projects/nz-flag-design/trunk/design-2d/image-data-to-file.jsp	(revision 29608)
@@ -52,12 +52,17 @@
      File flag_file  = new File(render_images_dir,"flag.png");
 
-     String image_data = request.getParameter("imageData");
+     String image_data     = request.getParameter("imageData");
+
+     String image_filename = request.getParameter("imageFilename");
+     if (image_filename == null) {
+	image_filename = "flag.png";
+     }
+     File full_image_file  = new File(render_images_dir,image_filename);
 
 
-
-     writeImageDataToFile(flag_file,image_data);
+     writeImageDataToFile(full_image_file,image_data);
      
      out.println("<script>");
-     out.println("message = \"Image File Saved: &lt;docBase&gt;/render-3d/images/" + flag_file.getName() + "\";");
+     out.println("message = \"Image File Saved: &lt;docBase&gt;/render-3d/images/" + image_filename + "\";");
      out.println("</script>");
 
Index: /other-projects/nz-flag-design/trunk/main-form/index.html
===================================================================
--- /other-projects/nz-flag-design/trunk/main-form/index.html	(revision 29607)
+++ /other-projects/nz-flag-design/trunk/main-form/index.html	(revision 29608)
@@ -20,11 +20,6 @@
 
     <!-- jQuery -->
-<!--
-    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
--->
     <script src="lib/jquery-1.11.1.min.js"></script>
-<!--
-    <script src="lib/jquery-1.8.2.min.js"></script>
--->
+    <script src="lib/jquery.cookie.js"></script>
 
     <!-- page swipe -->
Index: /other-projects/nz-flag-design/trunk/main-form/iterative-design.html
===================================================================
--- /other-projects/nz-flag-design/trunk/main-form/iterative-design.html	(revision 29607)
+++ /other-projects/nz-flag-design/trunk/main-form/iterative-design.html	(revision 29608)
@@ -98,12 +98,18 @@
 			var datauri = quality ? c.toDataURL('image/' + dataURLType, quality) : c.toDataURL('image/' + dataURLType);
 
+			// Look up jsession id; if not present fall back to use a timestamp
+			var jsession_id = $.cookie('JSESSIONID') || new Date().getTime();
+			console.log("jsession id = " + jsession_id);
+			var imageFilename = "flag-" + jsession_id + ".png";
+
 	                $.ajax({
 	                    type: "POST",
 	                    url: "../design-2d/image-data-to-file.jsp",
-	                    data: { imageData : datauri },
+	                    data: { imageData: datauri, imageFilename: imageFilename },
 	                    success: function() { 
 			          console.log("Exported PNG data to file ");
 				  var render_frame = document.getElementById('render-3d-iframe');
-				  render_frame.contentWindow.createFlag(); // triggers reload
+				  // trigger a reload in the 3D Flag Renderer
+				  render_frame.contentWindow.createFlag(imageFilename); 
 				}
 	                });
Index: /other-projects/nz-flag-design/trunk/main-form/lib/jquery.cookie.js
===================================================================
--- /other-projects/nz-flag-design/trunk/main-form/lib/jquery.cookie.js	(revision 29608)
+++ /other-projects/nz-flag-design/trunk/main-form/lib/jquery.cookie.js	(revision 29608)
@@ -0,0 +1,117 @@
+/*!
+ * jQuery Cookie Plugin v1.4.1
+ * https://github.com/carhartl/jquery-cookie
+ *
+ * Copyright 2006, 2014 Klaus Hartl
+ * Released under the MIT license
+ */
+(function (factory) {
+	if (typeof define === 'function' && define.amd) {
+		// AMD
+		define(['jquery'], factory);
+	} else if (typeof exports === 'object') {
+		// CommonJS
+		factory(require('jquery'));
+	} else {
+		// Browser globals
+		factory(jQuery);
+	}
+}(function ($) {
+
+	var pluses = /\+/g;
+
+	function encode(s) {
+		return config.raw ? s : encodeURIComponent(s);
+	}
+
+	function decode(s) {
+		return config.raw ? s : decodeURIComponent(s);
+	}
+
+	function stringifyCookieValue(value) {
+		return encode(config.json ? JSON.stringify(value) : String(value));
+	}
+
+	function parseCookieValue(s) {
+		if (s.indexOf('"') === 0) {
+			// This is a quoted cookie as according to RFC2068, unescape...
+			s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
+		}
+
+		try {
+			// Replace server-side written pluses with spaces.
+			// If we can't decode the cookie, ignore it, it's unusable.
+			// If we can't parse the cookie, ignore it, it's unusable.
+			s = decodeURIComponent(s.replace(pluses, ' '));
+			return config.json ? JSON.parse(s) : s;
+		} catch(e) {}
+	}
+
+	function read(s, converter) {
+		var value = config.raw ? s : parseCookieValue(s);
+		return $.isFunction(converter) ? converter(value) : value;
+	}
+
+	var config = $.cookie = function (key, value, options) {
+
+		// Write
+
+		if (arguments.length > 1 && !$.isFunction(value)) {
+			options = $.extend({}, config.defaults, options);
+
+			if (typeof options.expires === 'number') {
+				var days = options.expires, t = options.expires = new Date();
+				t.setTime(+t + days * 864e+5);
+			}
+
+			return (document.cookie = [
+				encode(key), '=', stringifyCookieValue(value),
+				options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
+				options.path    ? '; path=' + options.path : '',
+				options.domain  ? '; domain=' + options.domain : '',
+				options.secure  ? '; secure' : ''
+			].join(''));
+		}
+
+		// Read
+
+		var result = key ? undefined : {};
+
+		// To prevent the for loop in the first place assign an empty array
+		// in case there are no cookies at all. Also prevents odd result when
+		// calling $.cookie().
+		var cookies = document.cookie ? document.cookie.split('; ') : [];
+
+		for (var i = 0, l = cookies.length; i < l; i++) {
+			var parts = cookies[i].split('=');
+			var name = decode(parts.shift());
+			var cookie = parts.join('=');
+
+			if (key && key === name) {
+				// If second argument (value) is a function it's a converter...
+				result = read(cookie, value);
+				break;
+			}
+
+			// Prevent storing a cookie that we couldn't decode.
+			if (!key && (cookie = read(cookie)) !== undefined) {
+				result[name] = cookie;
+			}
+		}
+
+		return result;
+	};
+
+	config.defaults = {};
+
+	$.removeCookie = function (key, options) {
+		if ($.cookie(key) === undefined) {
+			return false;
+		}
+
+		// Must not alter options, thus extending a fresh object...
+		$.cookie(key, '', $.extend({}, options, { expires: -1 }));
+		return !$.cookie(key);
+	};
+
+}));
Index: /other-projects/nz-flag-design/trunk/render-3d/flag.html
===================================================================
--- /other-projects/nz-flag-design/trunk/render-3d/flag.html	(revision 29607)
+++ /other-projects/nz-flag-design/trunk/render-3d/flag.html	(revision 29608)
@@ -355,5 +355,8 @@
 			var flag_toggle = 0;
 			
-			function createFlag() {
+			function createFlag(flagFilename) {
+			        if (flagFilename) {
+				    flags[0] = "./images/" + flagFilename;
+				}
 	
 				if(initial){
Index: /other-projects/nz-flag-design/trunk/similarity-2d/list-flags.jsp
===================================================================
--- /other-projects/nz-flag-design/trunk/similarity-2d/list-flags.jsp	(revision 29607)
+++ /other-projects/nz-flag-design/trunk/similarity-2d/list-flags.jsp	(revision 29608)
@@ -31,6 +31,4 @@
 
       out.println("</script>");
-    }
-
-
+    
    %>
