Index: /trunk/doc/manual/en_US/user_BasicConcepts.xml
===================================================================
--- /trunk/doc/manual/en_US/user_BasicConcepts.xml	(revision 55258)
+++ /trunk/doc/manual/en_US/user_BasicConcepts.xml	(revision 55259)
@@ -1138,14 +1138,4 @@
                       identify the virtual machine but may be freely
                       chosen.</para>
-                      <para>For forwarding serial traffic, you can use a helper
-                      program called VMware Serial Line Gateway, available for
-                      download at
-                                  <literal> <ulink
-                      url="http://www.l4ka.org/91.php">http://www.l4ka.org/91.php</ulink>
-                      </literal>. This tool provides a fixed server mode named
-                      pipe at
-                      <computeroutput>\\.\pipe\vmwaredebug</computeroutput>
-                      and connects incoming TCP connections on port 567 with
-                      the named pipe.</para>
                     </listitem>
 
@@ -1187,4 +1177,25 @@
                 </para>
               </listitem>
+
+              <listitem>
+                <para>TCP Socket: useful for forwarding serial traffic over TCP/IP, acting as a server,
+                   or it can act as a TCP client connecting to other servers.
+                   It allows remote machine to connect via TCP directly to guest's serial port.
+                </para>
+                <para>TCP Server: use "create socket" mode, and type in only the <emphasis role="bold">
+                  <computeroutput>port</computeroutput></emphasis> number.
+                   Typically 23 or 2023. Note that on UNIX-like systems you will have to use port
+                   number over 1024 for normal users.
+                </para>
+                <para>
+                   The client can use software such as "Putty" or command-line "telnet" to access TCP Server.
+                </para>
+                <para>TCP Client: to create a virtual null-modem cable over the Internet or LAN,
+                   the other side can connect via TCP by specifying <emphasis role="bold">
+                   <computeroutput>hostname:port</computeroutput></emphasis>.
+                   TCP socket will act in client mode, if you remove "create socket" mode.
+                </para>
+              </listitem>
+
             </itemizedlist></para>
         </listitem>
Index: /trunk/doc/manual/en_US/user_VBoxManage.xml
===================================================================
--- /trunk/doc/manual/en_US/user_VBoxManage.xml	(revision 55258)
+++ /trunk/doc/manual/en_US/user_VBoxManage.xml	(revision 55259)
@@ -1023,4 +1023,21 @@
                 </listitem>
 
+                <listitem>
+                  <para><computeroutput>tcpserver
+                  &lt;port&gt;</computeroutput>: This
+                  tells VirtualBox to create a TCP socket on the host with TCP
+                  <computeroutput>&lt;port&gt;</computeroutput> and
+                  connect the virtual serial device to it. Note that UNIX-like
+                  systems require ports over 1024 for normal users.</para>
+                </listitem>
+
+                <listitem>
+                  <para><computeroutput>tcpclient
+                  &lt;hostname:port&gt;</computeroutput>: This operates just like
+                  <computeroutput>tcpserver ...</computeroutput>, except that the
+                  TCP socket is not created by VirtualBox,
+                  but assumed to exist already.</para>
+                </listitem>
+                
                 <listitem>
                   <para><computeroutput>&lt;devicename&gt;</computeroutput>:
Index: /trunk/include/VBox/log.h
===================================================================
--- /trunk/include/VBox/log.h	(revision 55258)
+++ /trunk/include/VBox/log.h	(revision 55259)
@@ -204,4 +204,6 @@
     /** Host SCSI driver group. */
     LOG_GROUP_DRV_SCSIHOST,
+    /** TCP socket stream driver group. */
+    LOG_GROUP_DRV_TCP,
     /** Async transport driver group */
     LOG_GROUP_DRV_TRANSPORT_ASYNC,
@@ -849,4 +851,5 @@
     "DRV_SCSI",     \
     "DRV_SCSIHOST", \
+    "DRV_TELNETSERVER", \
     "DRV_TRANSPORT_ASYNC", \
     "DRV_TUN",      \
Index: /trunk/src/VBox/Devices/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Devices/Makefile.kmk	(revision 55258)
+++ /trunk/src/VBox/Devices/Makefile.kmk	(revision 55259)
@@ -178,4 +178,5 @@
  	Serial/DrvChar.cpp \
  	Serial/DrvNamedPipe.cpp \
+ 	Serial/DrvTCP.cpp \
  	Serial/DrvRawFile.cpp \
  	Storage/DrvBlock.cpp \
Index: /trunk/src/VBox/Devices/build/VBoxDD.cpp
===================================================================
--- /trunk/src/VBox/Devices/build/VBoxDD.cpp	(revision 55258)
+++ /trunk/src/VBox/Devices/build/VBoxDD.cpp	(revision 55259)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2014 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -338,4 +338,7 @@
     if (RT_FAILURE(rc))
         return rc;
+    rc = pCallbacks->pfnRegister(pCallbacks, &g_DrvTCP);
+    if (RT_FAILURE(rc))
+        return rc;
     rc = pCallbacks->pfnRegister(pCallbacks, &g_DrvRawFile);
     if (RT_FAILURE(rc))
Index: /trunk/src/VBox/Devices/build/VBoxDD.h
===================================================================
--- /trunk/src/VBox/Devices/build/VBoxDD.h	(revision 55258)
+++ /trunk/src/VBox/Devices/build/VBoxDD.h	(revision 55259)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2014 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -147,4 +147,5 @@
 extern const PDMDRVREG g_DrvChar;
 extern const PDMDRVREG g_DrvNamedPipe;
+extern const PDMDRVREG g_DrvTCP;
 extern const PDMDRVREG g_DrvRawFile;
 extern const PDMDRVREG g_DrvHostParallel;
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp	(revision 55258)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp	(revision 55259)
@@ -273,4 +273,6 @@
                      "                                             server <pipe>|\n"
                      "                                             client <pipe>|\n"
+                     "                                             tcpserver <port>|\n"
+                     "                                             tcpclient <hostname:port>|\n"
                      "                                             file <file>|\n"
                      "                                             <devicename>]\n"
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp	(revision 55258)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp	(revision 55259)
@@ -1403,9 +1403,17 @@
                     case PortMode_RawFile:
                         if (details == VMINFO_MACHINEREADABLE)
-                            RTPrintf("uartmode%d=\"%ls\"\n", currentUART + 1,
+                            RTPrintf("uartmode%d=\"file,%ls\"\n", currentUART + 1,
                                      path.raw());
                         else
                             RTPrintf(", attached to raw file '%ls'\n",
                                      path.raw());
+                        break;
+                    case PortMode_TCP:
+                        if (details == VMINFO_MACHINEREADABLE)
+                            RTPrintf("uartmode%d=\"%s,%ls\"\n", currentUART + 1,
+                                     fServer ? "tcpserver" : "tcpclient", path.raw());
+                        else
+                            RTPrintf(", attached to tcp (%s) '%ls'\n",
+                                     fServer ? "server" : "client", path.raw());
                         break;
                     case PortMode_HostPipe:
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp	(revision 55258)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp	(revision 55259)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2014 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -1997,4 +1997,6 @@
                 else if (   !RTStrICmp(ValueUnion.psz, "server")
                          || !RTStrICmp(ValueUnion.psz, "client")
+                         || !RTStrICmp(ValueUnion.psz, "tcpserver")
+                         || !RTStrICmp(ValueUnion.psz, "tcpclient")
                          || !RTStrICmp(ValueUnion.psz, "file"))
                 {
@@ -2017,4 +2019,14 @@
                     {
                         CHECK_ERROR(uart, COMSETTER(HostMode)(PortMode_HostPipe));
+                        CHECK_ERROR(uart, COMSETTER(Server)(FALSE));
+                    }
+                    else if (!RTStrICmp(pszMode, "tcpserver"))
+                    {
+                        CHECK_ERROR(uart, COMSETTER(HostMode)(PortMode_TCP));
+                        CHECK_ERROR(uart, COMSETTER(Server)(TRUE));
+                    }
+                    else if (!RTStrICmp(pszMode, "tcpclient"))
+                    {
+                        CHECK_ERROR(uart, COMSETTER(HostMode)(PortMode_TCP));
                         CHECK_ERROR(uart, COMSETTER(Server)(FALSE));
                     }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendCOM.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendCOM.cpp	(revision 55258)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendCOM.cpp	(revision 55259)
@@ -372,4 +372,5 @@
         case KPortMode_HostDevice:   return QApplication::translate("VBoxGlobal", "Host Device", "PortMode");
         case KPortMode_RawFile:      return QApplication::translate("VBoxGlobal", "Raw File", "PortMode");
+        case KPortMode_TCP:          return QApplication::translate("VBoxGlobal", "TCP", "PortMode");
         AssertMsgFailed(("No text for %d", mode)); break;
     }
@@ -564,4 +565,5 @@
     list.insert(QApplication::translate("VBoxGlobal", "Host Device", "PortMode"),  KPortMode_HostDevice);
     list.insert(QApplication::translate("VBoxGlobal", "Raw File", "PortMode"),     KPortMode_RawFile);
+    list.insert(QApplication::translate("VBoxGlobal", "TCP", "PortMode"),          KPortMode_TCP);
     if (!list.contains(strMode))
     {
Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp	(revision 55258)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp	(revision 55259)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2014 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -1323,4 +1323,5 @@
                 if (mode == KPortMode_HostPipe ||
                     mode == KPortMode_HostDevice ||
+                    mode == KPortMode_TCP ||
                     mode == KPortMode_RawFile)
                     data += QString ("%1 (<nobr>%2</nobr>)")
Index: /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.cpp	(revision 55258)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.cpp	(revision 55259)
@@ -808,5 +808,6 @@
                     KPortMode mode = port.GetHostMode();
                     QString data = vboxGlobal().toCOMPortName(port.GetIRQ(), port.GetIOBase()) + ", ";
-                    if (mode == KPortMode_HostPipe || mode == KPortMode_HostDevice || mode == KPortMode_RawFile)
+                    if (mode == KPortMode_HostPipe || mode == KPortMode_HostDevice ||
+                        mode == KPortMode_RawFile || mode == KPortMode_TCP)
                         data += QString("%1 (%2)").arg(gpConverter->toString(mode)).arg(QDir::toNativeSeparators(port.GetPath()));
                     else
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.cpp	(revision 55258)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.cpp	(revision 55259)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2012 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -63,4 +63,5 @@
     mCbMode->addItem (""); /* KPortMode_HostDevice */
     mCbMode->addItem (""); /* KPortMode_RawFile */
+    mCbMode->addItem (""); /* KPortMode_TCP */
 
     /* Setup connections */
@@ -94,5 +95,6 @@
     mLbMode->setEnabled(m_pParent->isMachineOffline());
     mCbMode->setEnabled(m_pParent->isMachineOffline());
-    mCbPipe->setEnabled(mode == KPortMode_HostPipe && m_pParent->isMachineOffline());
+    mCbPipe->setEnabled((mode == KPortMode_HostPipe || mode == KPortMode_TCP)
+      && m_pParent->isMachineOffline());
     mLbPath->setEnabled(m_pParent->isMachineOffline());
     mLePath->setEnabled(mode != KPortMode_Disconnected && m_pParent->isMachineOffline());
@@ -167,4 +169,5 @@
     mCbNumber->setItemText (mCbNumber->count() - 1, vboxGlobal().toCOMPortName (0, 0));
 
+    mCbMode->setItemText (4, gpConverter->toString (KPortMode_TCP));
     mCbMode->setItemText (3, gpConverter->toString (KPortMode_RawFile));
     mCbMode->setItemText (2, gpConverter->toString (KPortMode_HostDevice));
@@ -205,5 +208,5 @@
 {
     KPortMode mode = gpConverter->fromString<KPortMode> (aText);
-    mCbPipe->setEnabled (mode == KPortMode_HostPipe);
+    mCbPipe->setEnabled (mode == KPortMode_HostPipe || mode == KPortMode_TCP);
     mLePath->setEnabled (mode != KPortMode_Disconnected);
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.ui
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.ui	(revision 55258)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.ui	(revision 55259)
@@ -3,5 +3,5 @@
  VBox frontends: Qt4 GUI ("VirtualBox"):
 
- Copyright (C) 2008-2012 Oracle Corporation
+ Copyright (C) 2008-2015 Oracle Corporation
 
  This file is part of VirtualBox Open Source Edition (OSE), as
@@ -177,8 +177,8 @@
        <widget class="QCheckBox" name="mCbPipe" >
         <property name="whatsThis" >
-         <string>If checked, the pipe specified in the &lt;b>Port Path&lt;/b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</string>
-        </property>
-        <property name="text" >
-         <string>&amp;Create Pipe</string>
+         <string>If checked, the pipe or socket specified in the &lt;b>Port Path&lt;/b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe or socket exists and try to use it.</string>
+        </property>
+        <property name="text" >
+         <string>&amp;Connect to existing pipe/socket</string>
         </property>
        </widget>
@@ -187,5 +187,5 @@
        <widget class="QLabel" name="mLbPath" >
         <property name="text" >
-         <string>Port/File &amp;Path:</string>
+         <string>&amp;Path/Address:</string>
         </property>
         <property name="alignment" >
@@ -200,5 +200,10 @@
        <widget class="QLineEdit" name="mLePath" >
         <property name="whatsThis" >
-         <string>Holds the path to the serial port's pipe on the host when the port is working in &lt;b>Host Pipe&lt;/b> mode, or the host serial device name when the port is working in &lt;b>Host Device&lt;/b> mode.</string>
+         <string>In &lt;b>Host Pipe&lt;/b> mode: Holds the path to the serial port's pipe on the host, examples:
+"\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively. 
+In &lt;b>Host Device&lt;/b> mode: Holds the host serial device name; examples: "COM1" or "/dev/ttyS0".
+In &lt;b>Raw file&lt;/b> mode: file-path on the host system, where serial output will be dumped.
+In &lt;b>TCP&lt;/b> mode: Holds TCP "port" when in server mode, or "hostname:port" or when in client mode.
+</string>
         </property>
        </widget>
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 55258)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 55259)
@@ -16419,5 +16419,5 @@
   <enum
     name="PortMode"
-    uuid="533b5fe3-0185-4197-86a7-17e37dd39d76"
+    uuid="7485fcfd-d603-470a-87af-26d33beb7de9"
     >
     <desc>
@@ -16437,4 +16437,7 @@
     <const name="RawFile"           value="3">
       <desc>Virtual device is attached to a raw file.</desc>
+    </const>
+    <const name="TCP"               value="4">
+      <desc>Virtual device is attached to a TCP socket.</desc>
     </const>
   </enum>
@@ -16507,5 +16510,5 @@
         Flag whether this serial port acts as a server (creates a new pipe on
         the host) or as a client (uses the existing pipe). This attribute is
-        used only when <link to="#hostMode"/> is PortMode_HostPipe.
+        used only when <link to="#hostMode"/> is PortMode_HostPipe or PortMode_TCP.
       </desc>
     </attribute>
@@ -16514,8 +16517,10 @@
       <desc>
         Path to the serial port's pipe on the host when <link to="ISerialPort::hostMode"/> is
-        PortMode_HostPipe, or the host serial device name when
-        <link to="ISerialPort::hostMode"/> is PortMode_HostDevice. For both
-        cases, setting a @c null or empty string as the attribute's value
-        is an error. Otherwise, the value of this property is ignored.
+        PortMode_HostPipe, the host serial device name when
+        <link to="ISerialPort::hostMode"/> is PortMode_HostDevice or the TCP
+       <b>port</b> (server) or <b>hostname:port</b> (client) when
+        <link to="ISerialPort::hostMode"/> is PortMode_TCP.
+        For those cases, setting a @c null or empty string as the attribute's
+        value is an error. Otherwise, the value of this property is ignored.
       </desc>
     </attribute>
Index: /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp	(revision 55258)
+++ /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp	(revision 55259)
@@ -10,5 +10,5 @@
 
 /*
- * Copyright (C) 2006-2014 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -2528,4 +2528,13 @@
                     InsertConfigString(pLunL1,  "DevicePath", bstr);
                 }
+                else if (eHostMode == PortMode_TCP)
+                {
+                    InsertConfigString(pLunL0,  "Driver", "Char");
+                    InsertConfigNode(pLunL0,    "AttachedDriver", &pLunL1);
+                    InsertConfigString(pLunL1,  "Driver", "TCP");
+                    InsertConfigNode(pLunL1,    "Config", &pLunL2);
+                    InsertConfigString(pLunL2,  "Location", bstr);
+                    InsertConfigInteger(pLunL2, "IsServer", fServer);
+                }
                 else if (eHostMode == PortMode_RawFile)
                 {
@@ -2717,5 +2726,5 @@
                     LogRel(("Audio: Automatically setting host audio backend to OSS\n"));
                     /* Manually set backend to OSS for now. */
-                    InsertConfigString(pLunL1, "Driver", "OSSAudio"); 
+                    InsertConfigString(pLunL1, "Driver", "OSSAudio");
 # else
                     InsertConfigString(pCfg, "AudioDriver", "solaudio");
Index: /trunk/src/VBox/Main/src-server/SerialPortImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/SerialPortImpl.cpp	(revision 55258)
+++ /trunk/src/VBox/Main/src-server/SerialPortImpl.cpp	(revision 55259)
@@ -258,4 +258,11 @@
                                     m->bd->ulSlot);
                 break;
+            case PortMode_TCP:
+                if (m->bd->strPath.isEmpty())
+                    return setError(E_INVALIDARG,
+                                    tr("Cannot set the host device mode of the serial port %d "
+                                       "because the server address or TCP port is invalid"),
+                                    m->bd->ulSlot);
+                break;
             case PortMode_Disconnected:
                 break;
@@ -637,4 +644,5 @@
     if (    (    m->bd->portMode == PortMode_HostDevice
               || m->bd->portMode == PortMode_HostPipe
+              || m->bd->portMode == PortMode_TCP
               || m->bd->portMode == PortMode_RawFile
             ) && str.isEmpty()
@@ -642,5 +650,5 @@
         return setError(E_INVALIDARG,
                         tr("Path of the serial port %d may not be empty or null in "
-                           "host pipe or host device mode"),
+                           "host pipe, host device or TCP mode"),
                         m->bd->ulSlot);
 
Index: /trunk/src/VBox/Main/xml/Settings.cpp
===================================================================
--- /trunk/src/VBox/Main/xml/Settings.cpp	(revision 55258)
+++ /trunk/src/VBox/Main/xml/Settings.cpp	(revision 55259)
@@ -2565,4 +2565,6 @@
         else if (strPortMode == "Disconnected")
             port.portMode = PortMode_Disconnected;
+        else if (strPortMode == "TCP")
+            port.portMode = PortMode_TCP;
         else
             throw ConfigFileError(this, pelmPort, N_("Invalid value '%s' in UART/Port/@hostMode attribute"), strPortMode.c_str());
@@ -4647,4 +4649,5 @@
             case PortMode_HostPipe: pcszHostMode = "HostPipe"; break;
             case PortMode_HostDevice: pcszHostMode = "HostDevice"; break;
+            case PortMode_TCP: pcszHostMode = "TCP"; break;
             case PortMode_RawFile: pcszHostMode = "RawFile"; break;
             default: /*case PortMode_Disconnected:*/ pcszHostMode = "Disconnected"; break;
@@ -4652,4 +4655,5 @@
         switch (port.portMode)
         {
+            case PortMode_TCP:
             case PortMode_HostPipe:
                 pelmPort->setAttribute("server", port.fServer);
@@ -5493,4 +5497,7 @@
     if (m->sv < SettingsVersion_v1_15)
     {
+        // VirtualBox 5.0 adds paravirt providers, explicit AHCI port hotplug
+        // setting, USB storage controller, xHCI and serial port TCP backend.
+
         /*
          * Check whether a paravirtualization provider other than "Legacy" is used, if so bump the version.
@@ -5510,5 +5517,4 @@
                  ++it)
             {
-                bool fSettingsBumped = false;
                 const StorageController &sctl = *it;
 
@@ -5516,6 +5522,5 @@
                 {
                     m->sv = SettingsVersion_v1_15;
-                    fSettingsBumped = true;
-                    break;
+                    return;
                 }
 
@@ -5532,12 +5537,7 @@
                     {
                         m->sv = SettingsVersion_v1_15;
-                        fSettingsBumped = true;
-                        break;
+                        return;
                     }
                 }
-
-                /* Abort early if possible. */
-                if (fSettingsBumped)
-                    return;
             }
 
@@ -5553,5 +5553,20 @@
                 {
                     m->sv = SettingsVersion_v1_15;
-                    break;
+                    return;
+                }
+            }
+
+            /*
+             * Check if any serial port uses the TCP backend.
+             */
+            for (SerialPortsList::const_iterator it = hardwareMachine.llSerialPorts.begin();
+                 it != hardwareMachine.llSerialPorts.end();
+                 ++it)
+            {
+                const SerialPort &port = *it;
+                if (port.portMode == PortMode_TCP)
+                {
+                    m->sv = SettingsVersion_v1_15;
+                    return;
                 }
             }
Index: /trunk/src/VBox/Main/xml/VirtualBox-settings.xsd
===================================================================
--- /trunk/src/VBox/Main/xml/VirtualBox-settings.xsd	(revision 55258)
+++ /trunk/src/VBox/Main/xml/VirtualBox-settings.xsd	(revision 55259)
@@ -7,5 +7,5 @@
  *  Common definitions
 
-    Copyright (C) 2004-2013 Oracle Corporation
+    Copyright (C) 2004-2015 Oracle Corporation
 
     This file is part of VirtualBox Open Source Edition (OSE), as
@@ -242,4 +242,5 @@
     <xsd:enumeration value="HostPipe"/>
     <xsd:enumeration value="HostDevice"/>
+    <xsd:enumeration value="TCP"/>
   </xsd:restriction>
 </xsd:simpleType>
