diff --git a/alib2std/src/extensions/string.hpp b/alib2std/src/extensions/string.hpp
index 445acbe0518f7ba34707f50a1d7dcd769ad3b89d..7f1011922861e604625e54e5484eb592678c7403 100644
--- a/alib2std/src/extensions/string.hpp
+++ b/alib2std/src/extensions/string.hpp
@@ -12,6 +12,7 @@
 #include <stdexcept>
 #include "compare.hpp"
 #include "vector.hpp"
+#include <algorithm>
 
 namespace ext {
 
@@ -125,6 +126,27 @@ ext::vector < std::string > explode ( const std::string & source, const std::str
 
 std::string implode ( const std::vector < std::string > & source, const std::string & delimiter );
 
+inline bool not_isspace ( int ch ) {
+	return ! std::isspace ( ch );
+}
+
+inline void ltrim ( std::string & s ) {
+	auto end = std::find_if ( s.begin ( ), s.end ( ), not_isspace );
+	s.erase ( s.begin ( ), end );
+}
+
+// trim from end (in place)
+inline void rtrim ( std::string & s ) {
+	auto begin = std::find_if ( s.rbegin ( ), s.rend ( ), not_isspace ).base ( );
+	s.erase ( begin, s.end ( ) );
+}
+
+// trim from both ends (in place)
+inline void trim ( std::string & s ) {
+	ltrim(s);
+	rtrim(s);
+}
+
 } /* namespace ext */
 
 #endif /* __STRING_HPP_ */