Index: trunk/src/org/apollo/io/SampledAudioFileImporter.java
===================================================================
--- trunk/src/org/apollo/io/SampledAudioFileImporter.java	(revision 1435)
+++ trunk/src/org/apollo/io/SampledAudioFileImporter.java	(revision 1436)
@@ -18,5 +18,5 @@
 public class SampledAudioFileImporter implements FileImporter {
 
-	public Item importFile(File f, Point location) throws IOException
+	public Item importFile(File f, Point location, boolean attachToFreeItems) throws IOException
 	{
 		if (location == null || !AudioIO.canImportFile(f) || DisplayController.getCurrentFrame() == null) return null;
Index: trunk/src/org/expeditee/actions/Misc.java
===================================================================
--- trunk/src/org/expeditee/actions/Misc.java	(revision 1435)
+++ trunk/src/org/expeditee/actions/Misc.java	(revision 1436)
@@ -1044,5 +1044,5 @@
 		}
 		try {
-			EcosystemManager.getDragAndDropManager().importFileList(files, EcosystemManager.getInputManager().getCursorPosition());
+			EcosystemManager.getDragAndDropManager().importFileList(files, EcosystemManager.getInputManager().getCursorPosition(), false);
 		} catch (Exception e) {
 		}
@@ -1053,5 +1053,5 @@
 		if (file.exists()) {
 			try {
-				EcosystemManager.getDragAndDropManager().importFile(file, EcosystemManager.getInputManager().getCursorPosition());
+				EcosystemManager.getDragAndDropManager().importFile(file, EcosystemManager.getInputManager().getCursorPosition(), false);
 			} catch (Exception e) {
 				e.printStackTrace();
Index: trunk/src/org/expeditee/agents/mail/MailSession.java
===================================================================
--- trunk/src/org/expeditee/agents/mail/MailSession.java	(revision 1435)
+++ trunk/src/org/expeditee/agents/mail/MailSession.java	(revision 1436)
@@ -517,5 +517,5 @@
 			final Frame frame, final Point point) {
 
-		final Text source = DragAndDropManager.importString("Reading message " + messageNo + "...", point);
+		final Text source = DragAndDropManager.importString("Reading message " + messageNo + "...", point, false);
 
 		new Thread() {
Index: trunk/src/org/expeditee/gio/ClipboardManager.java
===================================================================
--- trunk/src/org/expeditee/gio/ClipboardManager.java	(revision 1435)
+++ trunk/src/org/expeditee/gio/ClipboardManager.java	(revision 1436)
@@ -1,3 +1,6 @@
 package org.expeditee.gio;
+
+import java.io.File;
+import java.util.List;
 
 import org.expeditee.core.Image;
@@ -41,4 +44,9 @@
 		 */
 		public String stringRepresentation;
+		/**
+		 * A List representation of the clipboard data
+		 * (for use when copy/pasting to/from directories),
+		 */
+		public List<File> fileRepresentation;
 		
 		/** Default constructor. */
Index: trunk/src/org/expeditee/gio/DragAndDropManager.java
===================================================================
--- trunk/src/org/expeditee/gio/DragAndDropManager.java	(revision 1435)
+++ trunk/src/org/expeditee/gio/DragAndDropManager.java	(revision 1436)
@@ -11,4 +11,5 @@
 import org.expeditee.core.Point;
 import org.expeditee.gui.DisplayController;
+import org.expeditee.gui.FreeItems;
 import org.expeditee.importer.FileImporter;
 import org.expeditee.importer.FilePathImporter;
@@ -79,10 +80,10 @@
 	 * @param text
 	 *            The text content.
-	 * 
 	 * @param expediteeDropPoint
 	 *            The location in the current expeditee frame of where to drop
 	 *            the text item.
-	 */
-	public static Text importString(String text, Point expediteeDropPoint)
+	 * @param attachToFreeItems TODO
+	 */
+	public static Text importString(String text, Point expediteeDropPoint, boolean attachToFreeItems)
 	{
 		assert (DisplayController.getCurrentFrame() != null);
@@ -92,5 +93,10 @@
 		importedTextItem.setPosition(expediteeDropPoint);
 
-		DisplayController.getCurrentFrame().addItem(importedTextItem);
+		if (attachToFreeItems) {
+			FreeItems.getInstance().add(importedTextItem);
+			
+		} else {
+			DisplayController.getCurrentFrame().addItem(importedTextItem);
+		}
 		DisplayController.requestRefresh(true);
 
@@ -98,7 +104,7 @@
 	}
 
-	/** Imports a list of files into Expeditee's current frame. */
-	public void importFileList(List<? extends File> files, Point expediteeDropPoint) throws IOException
-	{
+	/** Imports a list of files into Expeditee's current frame. 
+	 * @param attachToFreeItems TODO*/
+	public void importFileList(List<? extends File> files, Point expediteeDropPoint, boolean attachToFreeItems) throws IOException {
 		Point currentPoint = new Point(expediteeDropPoint);
 
@@ -106,6 +112,6 @@
 		for (File fileToImport : files) {
 
-			Item lastItem = importFile(fileToImport, currentPoint);
-
+			Item lastItem = importFile(fileToImport, currentPoint, attachToFreeItems);
+			
 			if (lastItem == null) {
 				currentPoint.setY(currentPoint.getY() + 30);
@@ -127,10 +133,10 @@
 	 * @param f
 	 *            The file to import.
-	 * 
 	 * @param expediteeDropPoint
+	 * @param attachToFreeItems If true, instead of adding to generated item at {@code expediteeDropPoint}, add to free items.
 	 * 
 	 * @throws IOException
 	 */
-	public Item importFile(File f, Point expediteeDropPoint) throws IOException
+	public Item importFile(File f, Point expediteeDropPoint, boolean attachToFreeItems) throws IOException
 	{
 		assert (f != null);
@@ -139,7 +145,7 @@
 		// importing routines...
 		Item lastCreatedItem;
-		if (null == (lastCreatedItem = performFileImport(_customFileImporters, f, expediteeDropPoint))) {
+		if (null == (lastCreatedItem = performFileImport(_customFileImporters, f, expediteeDropPoint, attachToFreeItems))) {
 			// Standard file importing
-			lastCreatedItem = performFileImport(_standardFileImporters, f, expediteeDropPoint);
+			lastCreatedItem = performFileImport(_standardFileImporters, f, expediteeDropPoint, attachToFreeItems);
 		}
 		
@@ -150,9 +156,10 @@
 	 * Imports a single file into Expeditee's current frame. Importers are given the opportunity to
 	 * interpret the file in order of their addition to the list.
-	 */
-	private Item performFileImport(List<FileImporter> importers, File f, Point expediteeDropPoint) throws IOException
+	 * @param attachToFreeItems If true, instead of adding to generated item at {@code expediteeDropPoint}, add to free items.
+	 */
+	private Item performFileImport(List<FileImporter> importers, File f, Point expediteeDropPoint, boolean attachToFreeItems) throws IOException
 	{
 		for (FileImporter fi : importers) {
-			Item lastCreated = fi.importFile(f, expediteeDropPoint);
+			Item lastCreated = fi.importFile(f, expediteeDropPoint, attachToFreeItems);
 			
 			if (lastCreated != null) return lastCreated;
Index: trunk/src/org/expeditee/gio/javafx/JavaFXDragAndDropManager.java
===================================================================
--- trunk/src/org/expeditee/gio/javafx/JavaFXDragAndDropManager.java	(revision 1435)
+++ trunk/src/org/expeditee/gio/javafx/JavaFXDragAndDropManager.java	(revision 1436)
@@ -66,10 +66,10 @@
 						List<File> files = dragboard.getFiles();
 						if (files != null && files.size() > 0) {
-							importFileList(files, dropPoint);
+							importFileList(files, dropPoint, false);
 						}
 					} else if (dragboard.hasContent(_URIListDataflavorString)) {
 						String data = (String) dragboard.getContent(_URIListDataflavorString);
 						List<File> files = textURIListToFileList(data);
-						importFileList(files, dropPoint);
+						importFileList(files, dropPoint, false);
 						success = true;
 					} else if (dragboard.hasContent(_URIListDataflavorCharArray)) {
@@ -77,10 +77,10 @@
 						String uriString = new String(data);
 						List<File> files = textURIListToFileList(uriString);
-						importFileList(files, dropPoint);
+						importFileList(files, dropPoint, false);
 						success = true;
 					} else if (dragboard.hasString()) {
 						String str = dragboard.getString();
 						if (str != null && str.length() > 0) {
-							importString(str, dropPoint);
+							importString(str, dropPoint, false);
 							success = true;
 						}
Index: trunk/src/org/expeditee/gio/swing/SwingClipboardManager.java
===================================================================
--- trunk/src/org/expeditee/gio/swing/SwingClipboardManager.java	(revision 1435)
+++ trunk/src/org/expeditee/gio/swing/SwingClipboardManager.java	(revision 1436)
@@ -5,4 +5,5 @@
 import java.awt.datatransfer.Transferable;
 import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.File;
 import java.io.IOException;
 import java.util.LinkedList;
@@ -10,5 +11,9 @@
 
 import org.expeditee.core.Image;
+import org.expeditee.core.Point;
 import org.expeditee.gio.ClipboardManager;
+import org.expeditee.gio.DragAndDropManager;
+import org.expeditee.gio.EcosystemManager;
+import org.expeditee.gui.DisplayController;
 
 /** TODO: Comment. cts16 */
@@ -21,5 +26,6 @@
 			SwingClipboardManager.expediteeDataFlavour,
 			DataFlavor.imageFlavor,
-			DataFlavor.stringFlavor
+			DataFlavor.stringFlavor, 
+			DataFlavor.javaFileListFlavor
 	};
 	
@@ -82,6 +88,10 @@
 		} else if (DataFlavor.stringFlavor.equals(flavour)) {
 			out.stringRepresentation = (String) content.getTransferData(flavour);
+		} else if (DataFlavor.javaFileListFlavor.equals(flavour)) {
+			@SuppressWarnings("unchecked")
+			List<File> transferData = (List<File>) content.getTransferData(flavour);
+			out.fileRepresentation = transferData;
 		}
-	}
+ 	}
 	
 	private Image handleGetImage(Transferable content) throws IOException, UnsupportedFlavorException
Index: trunk/src/org/expeditee/gio/swing/SwingDragAndDropManager.java
===================================================================
--- trunk/src/org/expeditee/gio/swing/SwingDragAndDropManager.java	(revision 1435)
+++ trunk/src/org/expeditee/gio/swing/SwingDragAndDropManager.java	(revision 1436)
@@ -115,5 +115,5 @@
 
 						if (str != null && str.length() > 0) {
-							importString(str, expediteeDropPoint);
+							importString(str, expediteeDropPoint, false);
 							return true;
 						}
@@ -125,5 +125,5 @@
 						List<? extends File> files = (List<? extends File>) support.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
 
-						importFileList(files, expediteeDropPoint);
+						importFileList(files, expediteeDropPoint, false);
 
 						return true;
@@ -136,5 +136,5 @@
 						List<File> files = textURIListToFileList(data);
 
-						importFileList(files, expediteeDropPoint);
+						importFileList(files, expediteeDropPoint, false);
 
 						return true;
@@ -148,5 +148,5 @@
 						List<File> files = textURIListToFileList(uriString);
 
-						importFileList(files, expediteeDropPoint);
+						importFileList(files, expediteeDropPoint, false);
 
 						return true;
Index: trunk/src/org/expeditee/gui/management/ResourceManager.java
===================================================================
--- trunk/src/org/expeditee/gui/management/ResourceManager.java	(revision 1435)
+++ trunk/src/org/expeditee/gui/management/ResourceManager.java	(revision 1436)
@@ -29,16 +29,27 @@
 	private static ResolvedDirectoryList audio = instance.new ResolvedDirectoryList(FolderSettings.AudioDirs);
 	
-	public static void invalidateAllResourceDirectories() {
-		commonInvalidated = true;
-	}
-	
-	private static void refreshAll() {
-		Frame currentFrame = DisplayController.getCurrentFrame();
-		String framesetPath = currentFrame == null ? null : currentFrame.getFramesetPath();
-		frames.refresh(framesetPath);
-		images.refresh(framesetPath);
-		audio.refresh(framesetPath);
-	}
-	
+	/**
+	 * Attempts to relativise a image path using the users the directories listed for images in their settings.
+	 * @param path The path to attempt to relativise
+	 * @param context The context to use.  Most likely the Frame that the image is on.
+	 * @return Returns the most relativised path if one exists, otherwise returns a copy of the ref parameter passed in.
+	 */
+	public static Path relativiseImagePath(Path path, Frame context) {
+		String pathStr = path.toString();
+		
+		// Consult the resolved images directory for a list of paths to relativise too. 
+		List<String> directories = images.getDirectories(context);
+		
+		// Find the longest match that can be used to relativise the path.
+		String longestMatch = "";
+		for (String dir: directories) {
+			if (pathStr.startsWith(dir) && (dir.length() > longestMatch.length())) {
+				longestMatch = dir;
+			}
+		}
+		
+		return Paths.get(pathStr.replace(longestMatch, ""));
+	}
+			
 	/**
 	 * Creates a Frame object from an associated resour
@@ -224,4 +235,16 @@
 	}
 	
+	public static void invalidateAllResourceDirectories() {
+		commonInvalidated = true;
+	}
+	
+	private static void refreshAll() {
+		Frame currentFrame = DisplayController.getCurrentFrame();
+		String framesetPath = currentFrame == null ? null : currentFrame.getFramesetPath();
+		frames.refresh(framesetPath);
+		images.refresh(framesetPath);
+		audio.refresh(framesetPath);
+	}
+	
 	private class ResolvedDirectoryList {
 		private List<String> directories = null;
@@ -262,4 +285,5 @@
 		
 		private void refresh(String context) {
+			
 			List<String> unresolved = source.getAbsoluteDirs();
 			directories = resolve(unresolved, context);
Index: trunk/src/org/expeditee/importer/FileImporter.java
===================================================================
--- trunk/src/org/expeditee/importer/FileImporter.java	(revision 1435)
+++ trunk/src/org/expeditee/importer/FileImporter.java	(revision 1436)
@@ -42,8 +42,8 @@
 	 * @param f
 	 * 		The file to import. Not null.
-	 * 
 	 * @param location
 	 * 		The location in expeditee space where the import was requested. 
 	 * 		Null if not applicable.
+	 * @param attachToFreeItems TODO
 	 * 
 	 * @return 
@@ -55,4 +55,4 @@
 	 * 		If the import procedure failed.
 	 */
-	Item importFile(File f, Point location) throws IOException;
+	Item importFile(File f, Point location, boolean attachToFreeItems) throws IOException;
 }
Index: trunk/src/org/expeditee/importer/FilePathImporter.java
===================================================================
--- trunk/src/org/expeditee/importer/FilePathImporter.java	(revision 1435)
+++ trunk/src/org/expeditee/importer/FilePathImporter.java	(revision 1436)
@@ -35,7 +35,7 @@
 public class FilePathImporter implements FileImporter {
 
-	public Item importFile(File f, Point location) throws IOException {
+	public Item importFile(File f, Point location, boolean attachToFreeItems) throws IOException {
 		if (location != null && f != null) {
-			return DragAndDropManager.importString(f.getAbsolutePath(), location);			
+			return DragAndDropManager.importString(f.getAbsolutePath(), location, false);			
 		}
 
Index: trunk/src/org/expeditee/importer/ImageImporter.java
===================================================================
--- trunk/src/org/expeditee/importer/ImageImporter.java	(revision 1435)
+++ trunk/src/org/expeditee/importer/ImageImporter.java	(revision 1436)
@@ -34,4 +34,5 @@
 import org.expeditee.gui.FrameIO;
 import org.expeditee.gui.FrameUtils;
+import org.expeditee.gui.management.ResourceManager;
 import org.expeditee.items.Item;
 import org.expeditee.items.Text;
@@ -53,5 +54,5 @@
 	}
 
-	public Item importFile(File f, Point location) throws IOException {
+	public Item importFile(File f, Point location, boolean attachToFreeItems) throws IOException {
 
 		if (location == null || f == null) {
@@ -87,9 +88,13 @@
 		}
 		Text source; 
-		final Path imagePath = Paths.get(fullPath);
-		final Path imagesPath = Paths.get(FrameIO.IMAGES_PATH);
-		if(imagePath.startsWith(imagesPath))
-			source = DragAndDropManager.importString("@i: " + imagePath.getFileName() + size, location);
-		else source = DragAndDropManager.importString("@i: " + fullPath + size, location);
+		Path imagePath = Paths.get(fullPath);
+		Path imagePathRelitivized = ResourceManager.relativiseImagePath(imagePath, DisplayController.getCurrentFrame());
+		source = DragAndDropManager.importString("@i: " + imagePathRelitivized.toString() + size, location, attachToFreeItems);
+//		final Path imagesPath = Paths.get(FrameIO.IMAGES_PATH);
+//		if(imagePath.startsWith(imagesPath)) {
+//			source = DragAndDropManager.importString("@i: " + imagePath.getFileName() + size, location, attachToFreeItems);
+//		} else { 
+//			source = DragAndDropManager.importString("@i: " + fullPath + size, location, attachToFreeItems);
+//		}
 		source.setThickness(thickness);
 		source.setBorderColor(borderColor);
Index: trunk/src/org/expeditee/importer/TextImporter.java
===================================================================
--- trunk/src/org/expeditee/importer/TextImporter.java	(revision 1435)
+++ trunk/src/org/expeditee/importer/TextImporter.java	(revision 1436)
@@ -40,5 +40,5 @@
 	}
 
-	public Item importFile(final File f, Point location) throws IOException {
+	public Item importFile(final File f, Point location, boolean attachToFreeItems) throws IOException {
 		if (location == null || f == null) {
 			return null;
@@ -46,5 +46,5 @@
 		final String fullPath = f.getAbsolutePath();
 
-		final Text source = DragAndDropManager.importString(f.getPath(), location);
+		final Text source = DragAndDropManager.importString(f.getPath(), location, false);
 
 		// Create a frameCreator to write the text
Index: trunk/src/org/expeditee/importer/pdfImporter.java
===================================================================
--- trunk/src/org/expeditee/importer/pdfImporter.java	(revision 1435)
+++ trunk/src/org/expeditee/importer/pdfImporter.java	(revision 1436)
@@ -24,4 +24,6 @@
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 
 import org.expeditee.core.Colour;
@@ -37,4 +39,5 @@
 import org.expeditee.gui.FrameIO;
 import org.expeditee.gui.MessageBay;
+import org.expeditee.gui.management.ResourceManager;
 import org.expeditee.items.Item;
 import org.expeditee.items.Text;
@@ -45,5 +48,5 @@
 public class pdfImporter implements FileImporter {
 	
-	public Item importFile(final File f, Point location) throws IOException {
+	public Item importFile(final File f, Point location, boolean attachToFreeItems) throws IOException {
 		if (location == null || f == null) {
 			return null;
@@ -63,5 +66,5 @@
 		}
 		
-		final Text link = DragAndDropManager.importString(name, location);
+		final Text link = DragAndDropManager.importString(name, location, false);
 		link.setLink(name+"1");
 		
@@ -135,10 +138,12 @@
 			      g.popDrawingSurface();
 			      //save it as a file
-			      File out = new File(framesetPath+i+".png");
+			      Path p = Paths.get(framesetPath+i+".png");
+			      p = ResourceManager.relativiseImagePath(p, DisplayController.getCurrentFrame());
+			      File out = p.toFile();
 			      bimg.writeToDisk("png", out);
 			      //generate a frame with that image
 			      System.out.println(width);
-			      System.out.println("@i: "+framesetPath+i+".png "+width);
-						currentFrame.addText(x, y, "@i: "+framesetPath+i+".png "+width, null);
+			      System.out.println("@i: "+p.toString()+width);
+						currentFrame.addText(x, y, "@i: "+p.toString()+width, null);
 						if(i>1)
 						{
Index: trunk/src/org/expeditee/io/ItemSelection.java
===================================================================
--- trunk/src/org/expeditee/io/ItemSelection.java	(revision 1435)
+++ trunk/src/org/expeditee/io/ItemSelection.java	(revision 1436)
@@ -26,4 +26,5 @@
 
 import org.expeditee.core.Image;
+import org.expeditee.core.Point;
 import org.expeditee.gio.ClipboardManager.ClipboardData;
 import org.expeditee.gio.EcosystemManager;
@@ -204,4 +205,6 @@
 					prevItem = item;
 				}
+			} else if (content.fileRepresentation != null) { // Files
+				EcosystemManager.getDragAndDropManager().importFileList(content.fileRepresentation, DisplayController.getMousePosition(), true);
 			} /* else if {
 				// Next handler
Index: trunk/src/org/expeditee/setting/DirectoryListSetting.java
===================================================================
--- trunk/src/org/expeditee/setting/DirectoryListSetting.java	(revision 1435)
+++ trunk/src/org/expeditee/setting/DirectoryListSetting.java	(revision 1436)
@@ -3,10 +3,7 @@
 import java.io.File;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
 
-import org.expeditee.gui.DisplayController;
 import org.expeditee.gui.FrameIO;
 import org.expeditee.gui.FrameUtils;
