Index: trunk/src/VBox/Runtime/common/string/ministring.cpp
===================================================================
--- trunk/src/VBox/Runtime/common/string/ministring.cpp	(revision 36500)
+++ trunk/src/VBox/Runtime/common/string/ministring.cpp	(revision 36501)
@@ -332,2 +332,69 @@
 }
 
+iprt::list<iprt::MiniString, iprt::MiniString*> MiniString::split(const iprt::MiniString &strSep, SplitMode mode /* = RemoveEmptyParts */)
+{
+    iprt::list<iprt::MiniString> res;
+    if (!m_psz)
+        return res;
+    if (strSep.isEmpty())
+    {
+        res.append(iprt::MiniString(m_psz));
+        return res;
+    }
+
+    size_t cch = m_cch;
+    char *pszTmp = m_psz;
+    while(cch > 0)
+    {
+        char *pszNext = strstr(pszTmp, strSep.c_str());
+        if (!pszNext)
+            break;
+        size_t chNext = pszNext - pszTmp;
+        if (   chNext > 0
+            || mode == KeepEmptyParts)
+            res.append(iprt::MiniString(pszTmp, chNext));
+        pszTmp += chNext + strSep.length();
+        cch    -= chNext + strSep.length();
+    }
+    /* Some characters left at the end? */
+    if (cch > 0)
+        res.append(iprt::MiniString(pszTmp, cch));
+
+    return res;
+}
+
+/* static */
+iprt::MiniString MiniString::join(const iprt::list<iprt::MiniString, iprt::MiniString*> &list, const iprt::MiniString &strSep /* = "" */)
+{
+    MiniString res;
+    if (list.size() > 1)
+    {
+        for(size_t i = 0; i < list.size() - 1; ++i)
+            res += list.at(i) + strSep;
+        res += list.last();
+    }
+
+    return res;
+}
+
+const iprt::MiniString operator+(const iprt::MiniString &one, const iprt::MiniString &other)
+{
+    iprt::MiniString res(one);
+
+    return res += other;
+}
+
+const iprt::MiniString operator+(const iprt::MiniString &one, const char *pcszOther)
+{
+    iprt::MiniString res(one);
+
+    return res += pcszOther;
+}
+
+const iprt::MiniString operator+(const char *pcszOne, const iprt::MiniString &other)
+{
+    iprt::MiniString res(pcszOne);
+
+    return res += other;
+}
+
Index: trunk/src/VBox/Runtime/testcase/tstIprtMiniString.cpp
===================================================================
--- trunk/src/VBox/Runtime/testcase/tstIprtMiniString.cpp	(revision 36500)
+++ trunk/src/VBox/Runtime/testcase/tstIprtMiniString.cpp	(revision 36501)
@@ -256,4 +256,37 @@
     CHECK_EQUAL(strTest.substr(pos), "ßäbcdef");
 
+    /* split */
+    iprt::list<iprt::MiniString> spList1 = iprt::MiniString("##abcdef##abcdef####abcdef##").split("##", iprt::MiniString::RemoveEmptyParts);
+    RTTESTI_CHECK(spList1.size() == 3);
+    for (size_t i = 0; i < spList1.size(); ++i)
+        RTTESTI_CHECK(spList1.at(i) == "abcdef");
+    iprt::list<iprt::MiniString> spList2 = iprt::MiniString("##abcdef##abcdef####abcdef##").split("##", iprt::MiniString::KeepEmptyParts);
+    RTTESTI_CHECK_RETV(spList2.size() == 5);
+    RTTESTI_CHECK(spList2.at(0) == "");
+    RTTESTI_CHECK(spList2.at(1) == "abcdef");
+    RTTESTI_CHECK(spList2.at(2) == "abcdef");
+    RTTESTI_CHECK(spList2.at(3) == "");
+    RTTESTI_CHECK(spList2.at(4) == "abcdef");
+    iprt::list<iprt::MiniString> spList3 = iprt::MiniString().split("##", iprt::MiniString::KeepEmptyParts);
+    RTTESTI_CHECK(spList3.size() == 0);
+    iprt::list<iprt::MiniString> spList4 = iprt::MiniString().split("");
+    RTTESTI_CHECK(spList4.size() == 0);
+    iprt::list<iprt::MiniString> spList5 = iprt::MiniString("abcdef").split("");
+    RTTESTI_CHECK_RETV(spList5.size() == 1);
+    RTTESTI_CHECK(spList5.at(0) == "abcdef");
+
+    /* join */
+    iprt::list<iprt::MiniString> jnList;
+    strTest = iprt::MiniString::join(jnList);
+    RTTESTI_CHECK(strTest == "");
+    strTest = iprt::MiniString::join(jnList, "##");
+    RTTESTI_CHECK(strTest == "");
+    for (size_t i = 0; i < 5; ++i)
+        jnList.append("abcdef");
+    strTest = iprt::MiniString::join(jnList);
+    RTTESTI_CHECK(strTest == "abcdefabcdefabcdefabcdefabcdef");
+    strTest = iprt::MiniString::join(jnList, "##");
+    RTTESTI_CHECK(strTest == "abcdef##abcdef##abcdef##abcdef##abcdef");
+
     /* special constructor and assignment arguments */
     iprt::MiniString StrCtor1("");
