Index: /trunk/src/org/expeditee/core/Image.java
===================================================================
--- /trunk/src/org/expeditee/core/Image.java	(revision 1426)
+++ /trunk/src/org/expeditee/core/Image.java	(revision 1427)
@@ -8,4 +8,5 @@
 
 import org.expeditee.core.bounds.AxisAlignedBoxBounds;
+import org.expeditee.encryption.core.EncryptedImage;
 import org.expeditee.gio.ImageManager;
 
@@ -26,5 +27,5 @@
 
 	/** The ImageManager used to perform platform-specific image interactions. */
-	private static ImageManager _manager = null;
+	protected static ImageManager _manager = null;
 	
 	/** Sets the platform-specific ImageManager for all images. Can only be set once. */
@@ -72,6 +73,5 @@
 	
 	/** Private constructor as instantiation handled through Image.get(boolean). */
-	private Image(boolean fromDisk)
-	{
+	protected Image(boolean fromDisk) {
 		// Assign the next available handle ID number
 		_handle = nextHandle;
@@ -147,8 +147,4 @@
 	}
 	
-	public static Image getNoise() {
-		return _manager.getNoise();
-	}
-	
 	/** Convenience access to ImageManager.getImage(URL). */
 	public static Image getImage(URL url)
@@ -158,7 +154,10 @@
 
 	/** Convenience access to ImageManager.getImage(String). */
-	public static Image getImage(String filename)
-	{
-		return _manager.getImage(filename);
+	public static Image getImage(String filename) {
+		if (filename.endsWith(EncryptedImage.EXPEDITEE_ENCRYPTED_IMAGE_EXTENSION)) {
+			return EncryptedImage.getImage(filename);
+		} else {
+			return _manager.getImage(filename);
+		}
 	}
 
@@ -168,5 +167,5 @@
 		return _manager.getImage(connection);
 	}
-
+	
 	/** Convenience access to ImageManager.releaseImage(Image). */
 	public void releaseImage()
Index: /trunk/src/org/expeditee/encryption/core/EncryptedImage.java
===================================================================
--- /trunk/src/org/expeditee/encryption/core/EncryptedImage.java	(revision 1427)
+++ /trunk/src/org/expeditee/encryption/core/EncryptedImage.java	(revision 1427)
@@ -0,0 +1,101 @@
+package org.expeditee.encryption.core;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.crypto.Cipher;
+import javax.crypto.CipherInputStream;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.expeditee.core.Image;
+import org.expeditee.encryption.CryptographyConstants;
+import org.expeditee.items.Picture;
+
+@SuppressWarnings("serial")
+public class EncryptedImage extends Image implements CryptographyConstants {
+		
+	/** String specifying the extension for encrypted images. */
+	public static String EXPEDITEE_ENCRYPTED_IMAGE_EXTENSION = ".eei";
+
+	private EncryptedImage(boolean fromDisk) {
+		super(fromDisk);
+	}	
+	
+	public static Image getNoise() {
+		return _manager.getNoise();
+	}
+	
+	public static Image getImage(String filename, byte[] keyBytes) {
+		if (filename.endsWith(EXPEDITEE_ENCRYPTED_IMAGE_EXTENSION)) {
+			File file = new File(filename);
+			if (!file.exists() || file.isDirectory()) { return null; }
+			try {
+				SecretKey key = new SecretKeySpec(keyBytes, SymmetricAlgorithm);
+				Cipher cipher = Cipher.getInstance(SymmetricAlgorithm);
+				cipher.init(Cipher.DECRYPT_MODE, key);
+				CipherInputStream fIn = new CipherInputStream(new FileInputStream(file), cipher);
+				
+				List<Byte> bytesArrayList = new ArrayList<Byte>();
+				int i;
+				while((i = fIn.read()) != -1) {
+					bytesArrayList.add((byte) i);
+				}
+				fIn.close();
+
+				byte[] bytes = new byte[bytesArrayList.size()];
+				for (int o = 0; o < bytes.length; o++) {
+					bytes[o] = bytesArrayList.get(o);
+				}
+				
+				return _manager.createImage(bytes);
+			} catch (IOException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException e) {
+				e.printStackTrace();
+				return null;
+			}
+		} else {
+			return Image.getImage(filename);
+		}
+	}
+	
+	public static boolean encryptImage(Picture picture, byte[] keyBytes) {
+		SecretKey key = new SecretKeySpec(keyBytes, SymmetricAlgorithm);
+		Path imagePath = Paths.get(picture.getPath());
+		String imageName = picture.getName();
+		
+		try {
+			Cipher cipher = Cipher.getInstance(SymmetricAlgorithm);
+			cipher.init(Cipher.ENCRYPT_MODE, key);
+			CipherInputStream fIn = new CipherInputStream(new FileInputStream(imagePath.toFile()), cipher);
+			imagePath = imagePath.getParent().resolve(imageName.substring(0, imageName.lastIndexOf('.')) + EXPEDITEE_ENCRYPTED_IMAGE_EXTENSION);
+			FileOutputStream fOut = new FileOutputStream(imagePath.toFile());
+			
+			int i;
+			while((i = fIn.read()) != -1) {
+				fOut.write(i);
+			}
+			
+			fIn.close();
+			fOut.flush();
+			fOut.close();
+		} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IOException e) {
+			e.printStackTrace();
+			return false;
+		}
+		
+		return true;
+	}
+	
+	public static void encryptImage(String filename, byte[] keyBytes) {
+		
+	}
+}
Index: /trunk/src/org/expeditee/gio/ImageManager.java
===================================================================
--- /trunk/src/org/expeditee/gio/ImageManager.java	(revision 1426)
+++ /trunk/src/org/expeditee/gio/ImageManager.java	(revision 1427)
@@ -40,12 +40,4 @@
 		return createImage(size.width, size.height, hintUseAcceleratedMemory);
 	}
-	
-	/**
-	 * Creates an image of the given width and height in either main or video RAM.
-	 * 
-	 * @param hintUseAcceleratedMemory
-	 * 			True to use video RAM, false for main memory.
-	 */
-	public abstract Image createImage(int width, int height, boolean hintUseAcceleratedMemory);
 
 	/** Creates an image in main memory with the given size. */
@@ -56,8 +48,15 @@
 
 	/** Creates an image in main memory with the given width and height. */
-	public Image createImage(int width, int height)
-	{
+	public Image createImage(int width, int height)	{
 		return createImage(width, height, false);
 	}
+		
+	/**
+	 * Creates an image of the given width and height in either main or video RAM.
+	 * 
+	 * @param hintUseAcceleratedMemory
+	 * 			True to use video RAM, false for main memory.
+	 */
+	public abstract Image createImage(int width, int height, boolean hintUseAcceleratedMemory);
 	
 	/** Creates an image from packed 32-bit ARGB data in an array. */
@@ -66,4 +65,7 @@
 	/** Creates an image of a PDF page. */
 	public abstract Image createImage(int width, int height, PDFPage page);
+	
+	/** Creates an image from the raw byte data read from a file.  Must be in a format recognised by the implementing Ecosystem. **/
+	public abstract Image createImage(byte[] rawImageData);
 	
 	/** Creates a new image which is a cropped section of another image. */
@@ -75,4 +77,6 @@
 	/** Gets image data from a file. */
 	public abstract Image getImage(String filename);
+	
+	//public abstract Image getItem(byte[] imageData);
 	
 	/** Gets an image that is just noise */
Index: /trunk/src/org/expeditee/gio/javafx/JavaFXImageManager.java
===================================================================
--- /trunk/src/org/expeditee/gio/javafx/JavaFXImageManager.java	(revision 1426)
+++ /trunk/src/org/expeditee/gio/javafx/JavaFXImageManager.java	(revision 1427)
@@ -20,4 +20,5 @@
 import javafx.scene.image.PixelFormat;
 import javafx.scene.image.WritableImage;
+import sun.reflect.generics.reflectiveObjects.NotImplementedException;
 
 public class JavaFXImageManager extends ImageManager {
@@ -96,4 +97,10 @@
 		// Register the image
 		return register(writableImage, false);
+	}
+	
+
+	@Override
+	public Image createImage(byte[] rawImageData) {
+		throw new NotImplementedException();
 	}
 
Index: /trunk/src/org/expeditee/gio/swing/SwingImageManager.java
===================================================================
--- /trunk/src/org/expeditee/gio/swing/SwingImageManager.java	(revision 1426)
+++ /trunk/src/org/expeditee/gio/swing/SwingImageManager.java	(revision 1427)
@@ -117,4 +117,14 @@
 	}
 	
+	@Override
+	public org.expeditee.core.Image createImage(byte[] rawImageData) {
+		// Get the image from the given file
+		java.awt.Image swingImage = Toolkit.getDefaultToolkit().createImage(rawImageData);
+		if (swingImage == null) return null;
+		
+		// Register and return the handle
+		return register(swingImage, true);
+	}
+	
 	/**
 	 * Registers the given swing image with the Expeditee image system. Not available from the abstract interface.
Index: /trunk/src/org/expeditee/items/Item.java
===================================================================
--- /trunk/src/org/expeditee/items/Item.java	(revision 1426)
+++ /trunk/src/org/expeditee/items/Item.java	(revision 1427)
@@ -47,4 +47,5 @@
 import org.expeditee.core.bounds.EllipticalBounds;
 import org.expeditee.core.bounds.PolygonBounds;
+import org.expeditee.encryption.core.EncryptedImage;
 import org.expeditee.encryption.items.surrogates.EncryptionDetail;
 import org.expeditee.encryption.items.surrogates.EncryptionDetail.Type;
@@ -4049,4 +4050,5 @@
 		}
 		
+		//Setup surrogate items.
 		Item copy = this.copy();
 		if (copy.isAnnotation()) {
@@ -4075,4 +4077,17 @@
 			copy.setText("Encrypted"); 
 		}
+		
+		// Encrypt XRayables representative files and update pointer.
+		Collection<? extends XRayable> xrayables = this.getEnclosures();
+		for (XRayable xray: xrayables) {
+			if (xray instanceof Picture) {
+				EncryptedImage.encryptImage((Picture) xray, labelResult.key);
+				Text source = xray._source;
+				String oldName = xray.getName();
+				String newName = oldName.substring(0, oldName.lastIndexOf('.')) + EncryptedImage.EXPEDITEE_ENCRYPTED_IMAGE_EXTENSION;
+				source.setText(source.getText().replace(oldName, newName));
+			}
+		}
+		
 		this.addToSurrogates(copy);
 	}
Index: /trunk/src/org/expeditee/items/Picture.java
===================================================================
--- /trunk/src/org/expeditee/items/Picture.java	(revision 1426)
+++ /trunk/src/org/expeditee/items/Picture.java	(revision 1427)
@@ -37,4 +37,7 @@
 import org.expeditee.core.bounds.AxisAlignedBoxBounds;
 import org.expeditee.core.bounds.PolygonBounds;
+import org.expeditee.encryption.core.EncryptedImage;
+import org.expeditee.encryption.items.surrogates.Label;
+import org.expeditee.encryption.items.surrogates.Label.LabelResult;
 import org.expeditee.gio.EcosystemManager;
 import org.expeditee.gio.GraphicsManager;
@@ -42,4 +45,5 @@
 import org.expeditee.gui.FrameIO;
 import org.expeditee.gui.FrameUtils;
+import org.expeditee.gui.MessageBay;
 
 /**
@@ -62,5 +66,5 @@
 public class Picture extends XRayable {
 	
-	public static final String REDACTED_IMAGE_NAME = "redacted.png";
+	public static final String REDACTED_IMAGE_NAME = "expeditee_noise.encrypted";
 	
 	private static final float CROPPING_COMPOSITE_ALPHA = 0.5f;
@@ -775,30 +779,19 @@
 	@Override
 	public boolean refresh() {
-		// ImageIcon is faster, but cannot handle some formats
-		// (notably.bmp) hence, we try this first, then if it fails we try
-		// ImageIO
-		/*
-		try {
-			_image = new ImageIcon(_path).getImage();
-		} catch (Exception e) {
-		}
-
-		// if ImageIcon failed to read the image
-		if (_image == null || _image.getWidth() <= 0) {
-			try {
-				_image = ImageIO.read(new File(_path));
-			} catch (IOException e) {
-				// e.printStackTrace();
-				Logger.Log(e);
-				_image = null;
-				return false;
-			}
-		}
-*/
-		
 		if (isNoise()) {
-			_image = Image.getNoise();
+			_image = EncryptedImage.getNoise();
 		} else {
-			_image = Image.getImage(_path);
+			String encryptionLabel = _source.getEncryptionLabel();
+			if (encryptionLabel == null || encryptionLabel.isEmpty()) {
+				_image = Image.getImage(_path);
+			} else {
+				LabelResult result = Label.getLabel(encryptionLabel);
+				if (result == LabelResult.SuccessResolveLabelToKey) {
+					_image = EncryptedImage.getImage(_path, result.key);
+				} else {
+					MessageBay.displayMessage(result.toString());
+					_image = EncryptedImage.getNoise();
+				}
+			}
 		}
 		
Index: /trunk/src/org/expeditee/items/XRayable.java
===================================================================
--- /trunk/src/org/expeditee/items/XRayable.java	(revision 1426)
+++ /trunk/src/org/expeditee/items/XRayable.java	(revision 1427)
@@ -25,9 +25,9 @@
 import org.expeditee.core.Colour;
 import org.expeditee.core.Point;
+import org.expeditee.encryption.core.EncryptedImage;
 import org.expeditee.encryption.items.surrogates.Label;
 import org.expeditee.gui.DisplayController;
 
 public abstract class XRayable extends Item {
-	
 	
 	protected Text _source = null;
