Index: /trunk/src/org/expeditee/greenstone/Greenstone3Connection.java
===================================================================
--- /trunk/src/org/expeditee/greenstone/Greenstone3Connection.java	(revision 351)
+++ /trunk/src/org/expeditee/greenstone/Greenstone3Connection.java	(revision 352)
@@ -17,5 +17,5 @@
 import java.util.Set;
 
-import org.apache.xerces.parsers.DOMParser;
+//import org.apache.xerces.parsers.DOMParser;
 import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
@@ -425,64 +425,76 @@
 		StringReader sr = new StringReader(result);
 		InputSource is = new InputSource(sr);
-		DOMParser p = new DOMParser();
-
-		try {
-			p.parse(is);
-		} catch (SAXException se) {
-			System.err.println(se);
-		} catch (IOException ioe) {
-			System.err.println(ioe);
-		}
-		Document d = p.getDocument();
-		NodeList metadataList = d.getElementsByTagName("metadata");
-		for (int i = 0; i < metadataList.getLength(); i++) {
-			Node n = metadataList.item(i);
-			NamedNodeMap nnm = n.getAttributes();
-			Node att = nnm.getNamedItem("name");
-			if (att.getNodeValue().compareTo("numDocsMatched") == 0) {
-				queryOutcome.setHowManyDocsMatched(n.getFirstChild()
-						.getNodeValue());
-			} else if (att.getNodeValue().compareTo("numDocsReturned") == 0) {
-				queryOutcome.setHowManyDocsReturned(n.getFirstChild()
-						.getNodeValue());
-			}
-		}
-
-		NodeList documentList = d.getElementsByTagName("documentNode");
-		for (int i = 0; i < documentList.getLength(); i++) {
-			Node n = documentList.item(i);
-			NamedNodeMap nnm = n.getAttributes();
-			Node nid = nnm.getNamedItem("nodeID");
-			Node nscore = nnm.getNamedItem("rank");
-			String docID = nid.getFirstChild().getNodeValue();
-			queryOutcome.addResult(docID, firstDoc + i, nscore.getFirstChild()
-					.getNodeValue());
-		}
-		query.addQueryOutcome(queryOutcome);
-		Query q = (Query) query.clone();
-		queryList.add(q);
-
-		for (int i = 0; i < documentList.getLength(); i++) {
-			Node n = documentList.item(i);
-			NamedNodeMap nnm = n.getAttributes();
-			Node nid = nnm.getNamedItem("nodeID");
-			Node nscore = nnm.getNamedItem("rank");
-			String docID = nid.getFirstChild().getNodeValue();
-
-			QueryContext queryContext = new QueryContext(firstDoc + i, nscore
-					.getFirstChild().getNodeValue(), q);
-			if (allResults.containsKey(docID)) {
-				ResultDocument resultDocument = (ResultDocument) allResults
-						.get(docID);
-				resultDocument.incrementFrequencyReturned();
-				resultDocument.addQueryContext(queryContext);
-				allResults.put(docID, resultDocument);
-			} else {
-				ResultDocument resultDocument = new ResultDocument();
-				resultDocument.addQueryContext(queryContext);
-				allResults.put(docID, resultDocument);
-			}
-		}
-		return queryOutcome;
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		return null;
+		
+//		DOMParser p = new DOMParser();
+//
+//		try {
+//			p.parse(is);
+//		} catch (SAXException se) {
+//			System.err.println(se);
+//		} catch (IOException ioe) {
+//			System.err.println(ioe);
+//		}
+//		Document d = p.getDocument();
+//		NodeList metadataList = d.getElementsByTagName("metadata");
+//		for (int i = 0; i < metadataList.getLength(); i++) {
+//			Node n = metadataList.item(i);
+//			NamedNodeMap nnm = n.getAttributes();
+//			Node att = nnm.getNamedItem("name");
+//			if (att.getNodeValue().compareTo("numDocsMatched") == 0) {
+//				queryOutcome.setHowManyDocsMatched(n.getFirstChild()
+//						.getNodeValue());
+//			} else if (att.getNodeValue().compareTo("numDocsReturned") == 0) {
+//				queryOutcome.setHowManyDocsReturned(n.getFirstChild()
+//						.getNodeValue());
+//			}
+//		}
+//
+//		NodeList documentList = d.getElementsByTagName("documentNode");
+//		for (int i = 0; i < documentList.getLength(); i++) {
+//			Node n = documentList.item(i);
+//			NamedNodeMap nnm = n.getAttributes();
+//			Node nid = nnm.getNamedItem("nodeID");
+//			Node nscore = nnm.getNamedItem("rank");
+//			String docID = nid.getFirstChild().getNodeValue();
+//			queryOutcome.addResult(docID, firstDoc + i, nscore.getFirstChild()
+//					.getNodeValue());
+//		}
+//		query.addQueryOutcome(queryOutcome);
+//		Query q = (Query) query.clone();
+//		queryList.add(q);
+//
+//		for (int i = 0; i < documentList.getLength(); i++) {
+//			Node n = documentList.item(i);
+//			NamedNodeMap nnm = n.getAttributes();
+//			Node nid = nnm.getNamedItem("nodeID");
+//			Node nscore = nnm.getNamedItem("rank");
+//			String docID = nid.getFirstChild().getNodeValue();
+//
+//			QueryContext queryContext = new QueryContext(firstDoc + i, nscore
+//					.getFirstChild().getNodeValue(), q);
+//			if (allResults.containsKey(docID)) {
+//				ResultDocument resultDocument = (ResultDocument) allResults
+//						.get(docID);
+//				resultDocument.incrementFrequencyReturned();
+//				resultDocument.addQueryContext(queryContext);
+//				allResults.put(docID, resultDocument);
+//			} else {
+//				ResultDocument resultDocument = new ResultDocument();
+//				resultDocument.addQueryContext(queryContext);
+//				allResults.put(docID, resultDocument);
+//			}
+//		}
+//		return queryOutcome;
 	}
 
@@ -554,13 +566,14 @@
 		StringReader sr = new StringReader(result);
 		InputSource is = new InputSource(sr);
-		DOMParser p = new DOMParser();
-		try {
-			p.parse(is);
+		//DOMParser p = new DOMParser();
+	/*	try {
+			//p.parse(is);
 		} catch (SAXException se) {
 			System.err.println(se);
 		} catch (IOException ioe) {
 			System.err.println(ioe);
-		}
-		Document d = p.getDocument();
+		}*/
+		//Document d = p.getDocument();
+		Document d = null;
 		NodeList metadataList = d.getElementsByTagName("metadata");
 		String metadataval = null;
@@ -690,16 +703,17 @@
 		StringReader sr = new StringReader(result);
 		InputSource is = new InputSource(sr);
-		DOMParser p = new DOMParser();
-		try {
-			p.parse(is);
-		} catch (SAXException se) {
-			System.err.println(se);
-		} catch (IOException ioe) {
-			System.err.println(ioe);
-		}
+//		DOMParser p = new DOMParser();
+//		try {
+//			p.parse(is);
+//		} catch (SAXException se) {
+//			System.err.println(se);
+//		} catch (IOException ioe) {
+//			System.err.println(ioe);
+//		}
 
 		String returnName = null;
 
-		Document d = p.getDocument();
+		//Document d = p.getDocument();
+		Document d = null;
 		NodeList metadataList = d.getElementsByTagName("metadata");
 		for (int i = 0; i < metadataList.getLength(); i++) {
@@ -736,14 +750,14 @@
 		StringReader sr = new StringReader(result);
 		InputSource is = new InputSource(sr);
-		DOMParser p = new DOMParser();
-		try {
-			p.parse(is);
-		} catch (SAXException se) {
-			System.err.println(se);
-		} catch (IOException ioe) {
-			System.err.println(ioe);
-		}
-		Document d = p.getDocument();
-
+//		DOMParser p = new DOMParser();
+//		try {
+//			p.parse(is);
+//		} catch (SAXException se) {
+//			System.err.println(se);
+//		} catch (IOException ioe) {
+//			System.err.println(ioe);
+//		}
+//		Document d = p.getDocument();
+		Document d = null;
 		NodeList childList = d.getElementsByTagName("classifierNode");
 		NodeList documentList = d.getElementsByTagName("documentNode");
Index: /trunk/src/org/expeditee/gui/FrameMouseActions.java
===================================================================
--- /trunk/src/org/expeditee/gui/FrameMouseActions.java	(revision 351)
+++ /trunk/src/org/expeditee/gui/FrameMouseActions.java	(revision 352)
@@ -2543,9 +2543,16 @@
 
 							return remain;
-						} else if (mergee instanceof WidgetCorner
-								|| mergee instanceof WidgetEdge) {
+						} else if (mergee instanceof WidgetCorner) {
 							if (merger.size() == 1 && txt.getLink() != null) {
 								// If the text item is linked then use that
-								mergee.setLink(txt.getAbsoluteLink());
+								((WidgetCorner)mergee).setLink(txt.getAbsoluteLink(), txt);
+							} else {
+								remain.addAll(merger);
+							}
+							return remain;
+						} else if (mergee instanceof WidgetEdge) {
+							if (merger.size() == 1 && txt.getLink() != null) {
+								// If the text item is linked then use that
+								((WidgetEdge)mergee).setLink(txt.getAbsoluteLink(), txt);
 							} else {
 								remain.addAll(merger);
Index: /trunk/src/org/expeditee/items/widgets/DataFrameWidget.java
===================================================================
--- /trunk/src/org/expeditee/items/widgets/DataFrameWidget.java	(revision 351)
+++ /trunk/src/org/expeditee/items/widgets/DataFrameWidget.java	(revision 352)
@@ -108,5 +108,5 @@
 
 	@Override
-	public void setLink(String link) {
+	public void setLink(String link, Text linker) {
 		String newLink = Item.convertToAbsoluteLink(link);
 		String oldLink = getSource().getAbsoluteLink();
@@ -114,5 +114,5 @@
 				|| (newLink != null && newLink.equals(oldLink)))
 			return;
-		super.setLink(link);
+		super.setLink(link, linker);
 		clearSubjects();
 		setDataFrame(null);
Index: /trunk/src/org/expeditee/items/widgets/InteractiveWidget.java
===================================================================
--- /trunk/src/org/expeditee/items/widgets/InteractiveWidget.java	(revision 351)
+++ /trunk/src/org/expeditee/items/widgets/InteractiveWidget.java	(revision 352)
@@ -899,4 +899,8 @@
 		return Math.abs(_d4.getY() - _d1.getY());
 	}
+	
+	public Point getPosition() {
+		return new Point(getX(), getY());
+	}
 
 	/**
@@ -1549,8 +1553,11 @@
 	 * 
 	 * @param link
-	 *            The new frame link. Can be null (for no link)
-	 * 
-	 */
-	public void setLink(String link) {
+	 *          The new frame link. Can be null (for no link)
+	 * 
+	 * @param linker
+	 * 			The text item creating the link. Null if not created from
+	 * 			a text item.
+	 */
+	public void setLink(String link, Text linker) {
 		// Make sure the link is redrawn when a link is added
 		if (link == null)
Index: /trunk/src/org/expeditee/items/widgets/WidgetCorner.java
===================================================================
--- /trunk/src/org/expeditee/items/widgets/WidgetCorner.java	(revision 351)
+++ /trunk/src/org/expeditee/items/widgets/WidgetCorner.java	(revision 352)
@@ -8,4 +8,5 @@
 import org.expeditee.items.Dot;
 import org.expeditee.items.ItemParentStateChangedEvent;
+import org.expeditee.items.Text;
 
 public class WidgetCorner extends Dot {
@@ -170,5 +171,17 @@
 	@Override
 	public void setLink(String link) {
-		_widgetSource.setLink(link);
+		_widgetSource.setLink(link, null);
+	}
+	
+	/**
+	 * @param link
+	 *          The new frame link. Can be null (for no link)
+	 * 
+	 * @param linker
+	 * 			The text item creating the link. Null if not created from
+	 * 			a text item.
+	 */
+	public void setLink(String link, Text linker) {
+		_widgetSource.setLink(link, linker);
 	}
 
Index: /trunk/src/org/expeditee/items/widgets/WidgetEdge.java
===================================================================
--- /trunk/src/org/expeditee/items/widgets/WidgetEdge.java	(revision 351)
+++ /trunk/src/org/expeditee/items/widgets/WidgetEdge.java	(revision 352)
@@ -7,4 +7,5 @@
 import org.expeditee.items.Item;
 import org.expeditee.items.Line;
+import org.expeditee.items.Text;
 
 /**
@@ -136,7 +137,19 @@
 	}
 
- 	@Override
+	@Override
 	public void setLink(String link) {
-		_widgetSource.setLink(link);
+		_widgetSource.setLink(link, null);
+	}
+	
+	/**
+	 * @param link
+	 *          The new frame link. Can be null (for no link)
+	 * 
+	 * @param linker
+	 * 			The text item creating the link. Null if not created from
+	 * 			a text item.
+	 */
+	public void setLink(String link, Text linker) {
+		_widgetSource.setLink(link, linker);
 	}
 
Index: /trunk/src_apollo/org/apollo/AudioFrameMouseActions.java
===================================================================
--- /trunk/src_apollo/org/apollo/AudioFrameMouseActions.java	(revision 351)
+++ /trunk/src_apollo/org/apollo/AudioFrameMouseActions.java	(revision 352)
@@ -60,5 +60,5 @@
 			FrameMouseActions.MouseY = e.getY();
 			
-		} else if (e.isShiftDown() && 
+		} else if (e.isShiftDown() && !AudioFrameKeyboardActions.isControlDown &&
 				!FreeItems.getInstance().isEmpty()) { 
 			
@@ -143,5 +143,5 @@
 	 */
 	public static boolean isYAxisRestictionOn() {
-		return AudioFrameKeyboardActions.isControlDown && AudioFrameKeyboardActions.isShiftDown;
+		return AudioFrameKeyboardActions.isControlDown && !AudioFrameKeyboardActions.isShiftDown;
 	}
 	
Index: /trunk/src_apollo/org/apollo/audio/structure/AudioStructureModel.java
===================================================================
--- /trunk/src_apollo/org/apollo/audio/structure/AudioStructureModel.java	(revision 351)
+++ /trunk/src_apollo/org/apollo/audio/structure/AudioStructureModel.java	(revision 352)
@@ -1199,6 +1199,5 @@
 			if (odframe != null) { // is loaded?
 				AbstractTrackGraphNode tinf = odframe.getLinkedTrack(virtualFilename);
-				assert(tinf != null); // due to the assumption that the model is consistent
-				if (tinf.getName() != newName) {
+				if (tinf != null && tinf.getName() != newName) {
 					tinf.setName(newName);
 					// Note: a fetch might be waiting on this - i.e in progress. Thus must be cancelled.
Index: /trunk/src_apollo/org/apollo/gui/EditableSampledTrackGraphView.java
===================================================================
--- /trunk/src_apollo/org/apollo/gui/EditableSampledTrackGraphView.java	(revision 351)
+++ /trunk/src_apollo/org/apollo/gui/EditableSampledTrackGraphView.java	(revision 352)
@@ -133,19 +133,38 @@
 		case KeyEvent.VK_RIGHT:
 
-			float ftmp = (float)COARSE_PAN_PIXEL_LENGTH / (float)getWidth();
-			int pan = (int)(getTimeScaleLength() *  ftmp);
-			if (pan == 0) pan = 1;
-			
-			if (e.getKeyCode() == KeyEvent.VK_RIGHT &&
-					(getSampledTrackModel().getSelectionStart() +
-					getSampledTrackModel().getSelectionLength()) < getSampledTrackModel().getFrameCount()) { // RIGHT
-				
-				getSampledTrackModel().setSelection(getSampledTrackModel().getSelectionStart() + pan, 
-						getSampledTrackModel().getSelectionLength());
-				
-			} else if(e.getKeyCode() == KeyEvent.VK_LEFT &&
-					getSampledTrackModel().getSelectionStart() > 0) { // LEFT
-				getSampledTrackModel().setSelection(getSampledTrackModel().getSelectionStart() - pan, 
-						getSampledTrackModel().getSelectionLength());
+			// Select to end of track?
+			if (e.isControlDown()) {
+				if (e.getKeyCode() == KeyEvent.VK_LEFT) {
+					
+					int oldStart = getSampledTrackModel().getSelectionStart();
+					int oldLength = getSampledTrackModel().getSelectionLength();
+					if (oldLength < 1) oldLength = 1;
+					
+					getSampledTrackModel().setSelection(0, oldStart + oldLength);
+					
+				} else { // Right
+		
+					getSampledTrackModel().setSelection(
+							getSampledTrackModel().getSelectionStart(), 
+							getSampledTrackModel().getFrameCount() - getSampledTrackModel().getSelectionStart());
+					
+				}
+			} else {
+				float ftmp = (float)COARSE_PAN_PIXEL_LENGTH / (float)getWidth();
+				int pan = (int)(getTimeScaleLength() *  ftmp);
+				if (pan == 0) pan = 1;
+				
+				if (e.getKeyCode() == KeyEvent.VK_RIGHT &&
+						(getSampledTrackModel().getSelectionStart() +
+						getSampledTrackModel().getSelectionLength()) < getSampledTrackModel().getFrameCount()) { // RIGHT
+					
+					getSampledTrackModel().setSelection(getSampledTrackModel().getSelectionStart() + pan, 
+							getSampledTrackModel().getSelectionLength());
+					
+				} else if(e.getKeyCode() == KeyEvent.VK_LEFT &&
+						getSampledTrackModel().getSelectionStart() > 0) { // LEFT
+					getSampledTrackModel().setSelection(getSampledTrackModel().getSelectionStart() - pan, 
+							getSampledTrackModel().getSelectionLength());
+				}
 			}
 			break;
Index: /trunk/src_apollo/org/apollo/gui/FrameRenderPasses.java
===================================================================
--- /trunk/src_apollo/org/apollo/gui/FrameRenderPasses.java	(revision 351)
+++ /trunk/src_apollo/org/apollo/gui/FrameRenderPasses.java	(revision 352)
@@ -15,5 +15,4 @@
 import org.apollo.items.RecordOverdubLauncher;
 import org.apollo.widgets.LinkedTrack;
-import org.apollo.widgets.SampleRecorder;
 import org.apollo.widgets.SampledTrack;
 import org.expeditee.gui.Browser;
@@ -195,5 +194,5 @@
 					
 					if (iw != null && (iw instanceof SampledTrack ||
-							iw instanceof LinkedTrack || iw instanceof SampleRecorder)) {
+							iw instanceof LinkedTrack)) {
 						
 						if (seen == null) {
Index: /trunk/src_apollo/org/apollo/items/EmulatedTextItem.java
===================================================================
--- /trunk/src_apollo/org/apollo/items/EmulatedTextItem.java	(revision 351)
+++ /trunk/src_apollo/org/apollo/items/EmulatedTextItem.java	(revision 352)
@@ -201,5 +201,9 @@
 							(e.getKeyChar() == KeyEvent.VK_DELETE && !emulatedSource.isEmpty()) ||
 							e.getKeyChar() == KeyEvent.VK_SPACE ||
-							e.getKeyChar() == KeyEvent.VK_UNDERSCORE)) {
+							e.getKeyChar() == KeyEvent.VK_UNDERSCORE) ||
+							e.getKeyChar() == KeyEvent.VK_AMPERSAND ||
+							e.getKeyChar() == KeyEvent.VK_OPEN_BRACKET ||
+							e.getKeyChar() == KeyEvent.VK_CLOSE_BRACKET ||
+							e.getKeyChar() == KeyEvent.VK_MINUS) {
 
 
Index: /trunk/src_apollo/org/apollo/util/Mutable.java
===================================================================
--- /trunk/src_apollo/org/apollo/util/Mutable.java	(revision 351)
+++ /trunk/src_apollo/org/apollo/util/Mutable.java	(revision 352)
@@ -10,5 +10,4 @@
  */
 public class Mutable {
-	
 	private static Mutable instance = new Mutable();
 	private Mutable() {}
@@ -21,7 +20,17 @@
 	}
 	
+	public class Long {
+		public Long(long val) {
+			this.value = val;
+		}
+		public long value;
+	}
+	
 	public static Integer createMutableInteger(int val) {
 		return instance.new Integer(val);
 	}
-
+	
+	public static Long createMutableLong(long val) {
+		return instance.new Long(val);
+	}
 }
Index: /trunk/src_apollo/org/apollo/widgets/LinkedTrack.java
===================================================================
--- /trunk/src_apollo/org/apollo/widgets/LinkedTrack.java	(revision 351)
+++ /trunk/src_apollo/org/apollo/widgets/LinkedTrack.java	(revision 352)
@@ -208,5 +208,5 @@
 
 			public void keyPressed(KeyEvent e) {
-				if (state != PLAYING && state != STOPPED) return;
+				if ((state != PLAYING && state != STOPPED) || e.isControlDown()) return;
 				if (nameLabel.onKeyPressed(e, _swingComponent)) {
 					e.consume();
@@ -216,5 +216,5 @@
 
 			public void keyReleased(KeyEvent e) {
-				if (state != PLAYING && state != STOPPED) return;
+				if ((state != PLAYING && state != STOPPED) ||  e.isControlDown()) return;
 				if (nameLabel.onKeyReleased(e, _swingComponent)) {
 					e.consume();
@@ -771,9 +771,9 @@
 	 */
 	@Override
-	public void setLink(String link) {
+	public void setLink(String link, Text linker) {
 		
 		String oldABSLink = getAbsoluteLink();
 		
-		super.setLink(link);
+		super.setLink(link, linker);
 		
 		String newABSLink = getAbsoluteLink();
@@ -789,5 +789,4 @@
 				parentName);
 
-		
 		// And adding a new one (if applicable)
 		if (parent != null && newABSLink != null) {
@@ -798,4 +797,9 @@
 
 			if (initTime == null) initTime = 0L;
+			
+			String newName = (linker != null && linker.getText() != null) ? linker.getText() : getName();
+			if (newName != getName()) {
+				setName(newName);
+			}
 
 			AudioStructureModel.getInstance().onLinkedTrackWidgetAnchored(
@@ -804,5 +808,5 @@
 					initTime, // TODO: Revise: actually would be better to get from model .. if possible
 					newABSLink,
-					getName(),
+					newName,
 					getY());
 
Index: /trunk/src_apollo/org/apollo/widgets/SampledTrack.java
===================================================================
--- /trunk/src_apollo/org/apollo/widgets/SampledTrack.java	(revision 351)
+++ /trunk/src_apollo/org/apollo/widgets/SampledTrack.java	(revision 352)
@@ -63,4 +63,5 @@
 import org.expeditee.gui.Frame;
 import org.expeditee.gui.FrameGraphics;
+import org.expeditee.gui.FrameIO;
 import org.expeditee.gui.MouseEventRouter;
 import org.expeditee.gui.PopupManager;
@@ -393,5 +394,5 @@
 
 			public void keyPressed(KeyEvent e) {
-				if (nameLabel != null) {
+				if (!e.isControlDown() && nameLabel != null) {
 					if (nameLabel.onKeyPressed(e, fulltrackView)) {
 						e.consume();
@@ -401,5 +402,5 @@
 
 			public void keyReleased(KeyEvent e) {
-				if (nameLabel != null) {
+				if (!e.isControlDown() && nameLabel != null) {
 					if (nameLabel.onKeyReleased(e, fulltrackView)) {
 						e.consume();
@@ -414,5 +415,5 @@
 				
 				// Delete-and-Split audio command
-				if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_DELETE) {
+				else if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_DELETE) {
 					
 					// First is selection valid?
@@ -481,4 +482,52 @@
 					
 				}
+				// Convert to linked track
+				else if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_L) {
+
+					Frame current = DisplayIO.getCurrentFrame();
+					
+					if (current != null) {
+						
+						String name =  getName();
+						if (name == null) name = "Unamed";
+						
+						long initTime = getInitiationTimeFromMeta();
+						
+						Text linkSource = new Text(current.getNextItemID());
+						linkSource.addToData(TrackWidgetCommons.META_NAME_TAG + name);
+						linkSource.setPosition(getPosition());
+						linkSource.setParent(current);
+						LinkedTrack linkedVersion = new LinkedTrack(linkSource, null);
+
+						// Save any changes in the audio - or save for the first time
+						if (trackModel.isAudioModified())
+							saveWidgetData(); // a little lag is OK .. could make smarter if really need to
+						
+						// Create a new frame to hold the track
+						Frame newFrame = FrameIO.CreateNewFrame(SampledTrack.this.getFirstCorner());
+	
+						// Remove track from current frame
+						removeSelf();
+						
+						// Add to new frame
+						newFrame.addAllItems(getItems());
+						
+						// Save changes
+						FrameIO.SaveFrame(newFrame);
+						
+						// Link it
+						linkedVersion.setLink(newFrame.getName(), null);
+						
+						// Add the new link
+						current.addAllItems(linkedVersion.getItems());
+						
+						// Ensure initiation times are retained to the exact frame... avoiding loss due to resolution
+						linkedVersion.setInitiationTime(initTime);
+						
+	
+
+					}
+	
+				}
 
 			}
