--- a/common/Strings.cpp
+++ b/common/Strings.cpp
@@ -12,7 +12,8 @@
 #ifdef _WINDOWS
 #include <windows.h>
 #else
-#include <iconv.h>
+#include <locale>
+#include <codecvt>
 #endif
 #include <algorithm>
 #include <sstream>
@@ -50,35 +51,8 @@ std::wstring TelldusCore::charToWstring(
 	return retval;
 
 #else
-	size_t utf8Length = strlen(value);
-	size_t outbytesLeft = utf8Length*sizeof(wchar_t);
-
-	// Copy the instring
-	char *inString = new char[utf8Length+1];
-	snprintf(inString, utf8Length+1, "%s", value);
-
-	// Create buffer for output
-	char *outString = reinterpret_cast<char*>(new wchar_t[utf8Length+1]);
-	memset(outString, 0, sizeof(wchar_t)*(utf8Length+1));
-
-#ifdef _FREEBSD
-	const char *inPointer = inString;
-#else
-	char *inPointer = inString;
-#endif
-	char *outPointer = outString;
-
-	iconv_t convDesc = iconv_open(WCHAR_T_ENCODING, "UTF-8");
-	iconv(convDesc, &inPointer, &utf8Length, &outPointer, &outbytesLeft);
-	iconv_close(convDesc);
-
-	std::wstring retval( reinterpret_cast<wchar_t *>(outString) );
-
-	// Cleanup
-	delete[] inString;
-	delete[] outString;
-
-	return retval;
+	std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
+	return converter.from_bytes(value);
 #endif
 }
 
@@ -211,19 +185,8 @@ std::string TelldusCore::wideToString(co
 #else
 	char *inPointer = inString;
 #endif
-	char *outPointer = outString;
-
-	iconv_t convDesc = iconv_open("UTF-8", WCHAR_T_ENCODING);
-	iconv(convDesc, &inPointer, &wideSize, &outPointer, &outbytesLeft);
-	iconv_close(convDesc);
-
-	std::string retval(outString);
-
-	// Cleanup
-	delete[] inString;
-	delete[] outString;
-
-	return retval;
+	std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
+	return converter.to_bytes(input);
 #endif
 }
 
