diff --git a/exec/SlyEdit.js b/exec/SlyEdit.js
index d252fe6a09f0dff77a5c9663e9c5710de346daa9..563df43a867662a1ba0bf3615a140a91316f3900 100644
--- a/exec/SlyEdit.js
+++ b/exec/SlyEdit.js
@@ -56,6 +56,18 @@
  *                              SlyEdit won't ask the user if they want to add
  *                              a tagline, even if their tagline setting is
  *                              enabled.
+ * 2015-07-05 Eric Oulashin     Version 1.47
+ *                              Updated to read the tagline filename from line 7
+ *                              of the MSGINF dropfile.  If that line in MSGINF
+ *                              is available (starting with Synchronet 3.16 beta
+ *                              builds on July 5, 2015), then the user's chosen
+ *                              tagline will be written to the tagline file, and
+ *                              Synchronet will read that and append the tagline
+ *                              after the user's signature. If the MSGINF file
+ *                              doesn't have the 7th line, then SlyEdit will write
+ *                              the user's chosen tagline to the end of the message
+ *                              (thus the tagline will appear before the user's
+ *                              signature).
  */
 
 /* Command-line arguments:
@@ -133,8 +145,8 @@ if (!console.term_supports(USER_ANSI))
 }
 
 // Constants
-const EDITOR_VERSION = "1.46";
-const EDITOR_VER_DATE = "2015-06-25";
+const EDITOR_VERSION = "1.47";
+const EDITOR_VER_DATE = "2015-07-05";
 
 
 // Program variables
@@ -405,104 +417,113 @@ var gMsgSubj = "";
 var gFromName = user.alias;
 var gToName = gInputFilename;
 var gMsgArea = "";
+var gTaglineFile = "";
 var dropFileTime = -Infinity;
 var dropFileName = file_getcase(system.node_dir + "msginf");
 if (dropFileName != undefined)
 {
-   if (file_date(dropFileName) >= dropFileTime)
-   {
-      var dropFile = new File(dropFileName);
-      if (dropFile.exists && dropFile.open("r"))
-      {
-         dropFileTime = dropFile.date;
-         info = dropFile.readAll();
-         dropFile.close();
-
-         gFromName = info[0];
-         gToName = info[1];
-         gMsgSubj = info[2];
-         gMsgArea = info[4];
-
-         // Now that we know the name of the message area
-         // that the message is being posted in, call
-         // getCurMsgInfo() to set gMsgAreaInfo.
-         gMsgAreaInfo = getCurMsgInfo(gMsgArea);
-         setMsgAreaInfoObj = true;
-      }
-   }
-   file_remove(dropFileName);
+	if (file_date(dropFileName) >= dropFileTime)
+	{
+		var dropFile = new File(dropFileName);
+		if (dropFile.exists && dropFile.open("r"))
+		{
+			dropFileTime = dropFile.date;
+			info = dropFile.readAll();
+			dropFile.close();
+
+			gFromName = info[0];
+			gToName = info[1];
+			gMsgSubj = info[2];
+			gMsgArea = info[4];
+
+			// Now that we know the name of the message area
+			// that the message is being posted in, call
+			// getCurMsgInfo() to set gMsgAreaInfo.
+			gMsgAreaInfo = getCurMsgInfo(gMsgArea);
+			setMsgAreaInfoObj = true;
+
+			// If the msginf file has 7 lines, then the 7th line is the full
+			// path & filename of the tagline file, where we can write the
+			// user's chosen tag line (if the user has that option enabled)
+			// for the BBS software to read the tagline & insert it at the
+			// proper place in the message.
+			if (info.length >= 7)
+				gTaglineFile = info[6];
+		}
+	}
+	file_remove(dropFileName);
 }
 // If gMsgAreaInfo hasn't been set yet, then set it.
 if (!setMsgAreaInfoObj)
 {
-  gMsgAreaInfo = getCurMsgInfo(gMsgArea);
-  setMsgAreaInfoObj = true;
+	gMsgAreaInfo = getCurMsgInfo(gMsgArea);
+	setMsgAreaInfoObj = true;
 }
 // Set a variable to store whether or not cross-posting can be done.
 var gCanCrossPost = (gConfigSettings.allowCrossPosting && postingInMsgSubBoard(gMsgArea));
 // If the user is posting in a message sub-board, then add its information
 // to gCrossPostMsgSubs.
 if (postingInMsgSubBoard(gMsgArea))
-  gCrossPostMsgSubs.add(gMsgAreaInfo.subBoardCode);
+	gCrossPostMsgSubs.add(gMsgAreaInfo.subBoardCode);
 
 // Open the quote file / message file
 var inputFile = new File(gInputFilename);
 if (inputFile.open("r", false))
 {
-   // Read into the gQuoteLines or gEditLines array, depending on the value
-   // of gUseQuotes.  Use a buffer size that should be long enough.
-   if (gUseQuotes)
-   {
-      var textLine = null;  // Line of text read from the quotes file
-      while (!inputFile.eof)
-      {
-        textLine = inputFile.readln(2048);
-        // Only use textLine if it's actually a string.
-        if (typeof(textLine) == "string")
-        {
-           textLine = strip_ctrl(textLine);
-           // If the line has only whitespace and/or > characters,
-           // then make the line blank before putting it into
-           // gQuoteLines.
-           if (/^[\s>]+$/.test(textLine))
-              textLine = "";
-           gQuoteLines.push(textLine);
-        }
-     }
-   }
-   else
-   {
-      var textLine = null;
-      while (!inputFile.eof)
-      {
-         textLine = new TextLine();
-         textLine.text = inputFile.readln(2048);
-         if (typeof(textLine.text) == "string")
-            textLine.text = strip_ctrl(textLine.text);
-         else
-            textLine.text = "";
-         textLine.hardNewlineEnd = true;
-         // If there would still be room on the line for at least
-         // 1 more character, then add a space to the end of the
-         // line.
-         if (textLine.text.length < console.screen_columns-1)
-            textLine.text += " ";
-         gEditLines.push(textLine);
-      }
+	// Read into the gQuoteLines or gEditLines array, depending on the value
+	// of gUseQuotes.  Use a buffer size that should be long enough.
+	if (gUseQuotes)
+	{
+		var textLine = null;  // Line of text read from the quotes file
+		while (!inputFile.eof)
+		{
+			textLine = inputFile.readln(2048);
+			// Only use textLine if it's actually a string.
+			if (typeof(textLine) == "string")
+			{
+				textLine = strip_ctrl(textLine);
+				// If the line has only whitespace and/or > characters,
+				// then make the line blank before putting it into
+				// gQuoteLines.
+				if (/^[\s>]+$/.test(textLine))
+				textLine = "";
+				gQuoteLines.push(textLine);
+			}
+		}
+	}
+	else
+	{
+		var textLine = null;
+		while (!inputFile.eof)
+		{
+			textLine = new TextLine();
+			textLine.text = inputFile.readln(2048);
+			if (typeof(textLine.text) == "string")
+				textLine.text = strip_ctrl(textLine.text);
+			else
+				textLine.text = "";
+			textLine.hardNewlineEnd = true;
+			// If there would still be room on the line for at least
+			// 1 more character, then add a space to the end of the
+			// line.
+			if (textLine.text.length < console.screen_columns-1)
+			textLine.text += " ";
+			gEditLines.push(textLine);
+		}
 
-      // If the last edit line is undefined (which is possible after reading the end
-      // of the quotes file), then remove it from gEditLines.
-      if (gEditLines.length > 0)
-      {
-         if (gEditLines.length > 0)
-         {
-            var lastQuoteLineIndex = gEditLines.length - 1;
-            if (gEditLines[lastQuoteLineIndex].text == undefined)
-               gEditLines.splice(lastQuoteLineIndex, 1);
-         }
-      }
-   }
-   inputFile.close();
+		// If the last edit line is undefined (which is possible after reading the end
+		// of the quotes file), then remove it from gEditLines.
+		if (gEditLines.length > 0)
+		{
+			if (gEditLines.length > 0)
+			{
+				var lastQuoteLineIndex = gEditLines.length - 1;
+				if (gEditLines[lastQuoteLineIndex].text == undefined)
+					gEditLines.splice(lastQuoteLineIndex, 1);
+			}
+		}
+	}
+	inputFile.close();
 }
 
 // If the subject is blank, set it to something.
@@ -1438,20 +1459,12 @@ function doEditLoop()
 			var taglineRetObj = doTaglineSelection();
 			if (taglineRetObj.taglineWasSelected && taglineRetObj.tagline.length > 0)
 			{
-				// If the Synchronet version is at least 3.16, then write the tag line
-				// to editor.tag in the node's temp directory (Synchronet will read that
-				// and append its contents after the user's signature).  Otherwise (if
-				// the Synchronet version is below 3.16), then append the tagline to the
-				// message directly.
-				if (system.version_num >= 31600)
-				{
-					var taglineArray = new Array();
-					taglineArray.push(""); // Leave a blank line between the signature & tagline
-					taglineArray.push(taglineRetObj.tagline);
-					// The tag line could be wrapped to 79 characters, as follows:
-					//wrapTextLines(taglineArray, 0, taglineArray.length, 79);
-					writeTaglineToMsgTaglineFile(taglineArray);
-				}
+				// If the tagline filename was specified in the MSGINF drop file,
+				// then write the tag line to that file (Synchronet will read that
+				// and append its contents after the user's signature).  Otherwise,
+				// append the tagline to the message directly.
+				if (gTaglineFile.length > 0)
+					writeTaglineToMsgTaglineFile(taglineRetObj.tagline, gTaglineFile);
 				else
 				{
 					// Append a blank line and then append the tagline to the message
@@ -5837,45 +5850,43 @@ function setQuotePrefix()
 // temp directory).
 //
 // Parameters:
-//  pTaglines: An array of strings to write to the tagline file
+//  pTagline: The tagline to write to the file (a string)
+//  pTaglineFilename: The full path & filename of the tagline file
 //
 // Return value: Boolean - Whether or not the tagline file was successfully written.
-//               If pTaglines is empty, this will return true, since the effect
-//               would be no tag line.  If pTaglines is not an array (object), then
-//               this function will return false.
-function writeTaglineToMsgTaglineFile(pTaglines)
+//               If pTaglineFilename is empty or is not a string, or if pTagline is
+//               not a string, this will return false.  If pTagline is empty, then
+//               this will return true.
+function writeTaglineToMsgTaglineFile(pTagline, pTaglineFilename)
 {
-	if (typeof(pTaglines) != "object")
+	// Sanity checking
+	if ((typeof(pTagline) != "string") || (typeof(pTaglineFilename) != "string"))
 		return false;
-	if (pTaglines.length == 0)
+	if (pTaglineFilename.length == 0)
+		return false;
+	if (pTagline.length == 0)
 		return true;
 
 	var wroteTaglineFile = false;
-	var nodeTempDirWithoutTrailingSlash = backslash(system.node_dir) + "temp";
-	// If the node temp dir doesn't exist, then create it.
-	var tempDirExists = true;
-	if (!file_isdir(nodeTempDirWithoutTrailingSlash))
-	{
-		// If it's a regular file (not a directory), then delete it
-		// before trying to create it
-		var canCreateDir = true;
-		if (file_exists(nodeTempDirWithoutTrailingSlash))
-			canCreateDir = file_remove(nodeTempDirWithoutTrailingSlash);
-		tempDirExists = (canCreateDir ? mkdir(nodeTempDirWithoutTrailingSlash) : false);
-	}
-	if (tempDirExists)
+	var taglineFile = new File(pTaglineFilename);
+	if (taglineFile.open("w"))
 	{
-		var taglineFilename = backslash(nodeTempDirWithoutTrailingSlash) + "editor.tag";
-		if (file_exists(taglineFilename))
-			file_remove(taglineFilename);
-		var taglineFile = new File(taglineFilename);
-		if (taglineFile.open("w"))
-		{
-			for (var i = 0; i < pTaglines.length; ++i)
-				taglineFile.writeln(pTaglines[i]);
-			taglineFile.close();
-			wroteTaglineFile = true;
-		}
+		// If we wanted to wrap the tagline to 79 characters, it could be
+		// done as follows:
+		/*
+		var taglineArray = new Array();
+		taglineArray.push(""); // Leave a blank line between the signature & tagline
+		taglineArray.push(pTagline);
+		wrapTextLines(taglineArray, 0, taglineArray.length, 79);
+		// Write the tagline strings to the file
+		for (var i = 0; i < taglineArray.length; ++i)
+			taglineFile.writeln(taglineArray[i]);
+		*/
+		// Write the tagline to the file, with a blank line before it for spacing.
+		taglineFile.writeln("");
+		taglineFile.writeln(pTagline);
+		taglineFile.close();
+		wroteTaglineFile = true;
 	}
 	return wroteTaglineFile;
 }