diff --git a/include/Utils.h b/include/Utils.h
index 3ab76ae..508b03c 100644
--- a/include/Utils.h
+++ b/include/Utils.h
@@ -147,8 +147,9 @@ public:
 				    Glib::ustring & output,
 				    Glib::ustring & error,
 				    bool use_C_locale = false ) ;
-	static Glib::ustring regexp_label( const Glib::ustring & text,
-					const Glib::ustring & regular_sub_expression ) ;
+	static Glib::ustring regexp_label( const Glib::ustring & text
+	                                 , const Glib::ustring & pattern
+	                                 ) ;
 	static Glib::ustring fat_compliant_label( const Glib::ustring & label ) ;
 	static Glib::ustring create_mtoolsrc_file( char file_name[],
                     const char drive_letter, const Glib::ustring & device_path ) ;
diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc
index a2e7557..4469a38 100644
--- a/src/GParted_Core.cc
+++ b/src/GParted_Core.cc
@@ -995,14 +995,15 @@ void GParted_Core::set_device_partitions( Device & device )
 				break;
 		}
 
-		//Avoid reading additional file system information if there is no path
+		//Retrieve file system label
 		if ( partition_temp .get_path() != "" )
 		{
-			bool label_found = false ;
-			partition_temp .label = fs_info .get_label( partition_temp .get_path(), label_found ) ;
-			if ( ! label_found )
-				read_label( partition_temp ) ;
-
+			read_label( partition_temp ) ;
+			if ( partition_temp .label .empty() )
+			{
+				bool label_found = false ;
+				partition_temp .label = fs_info .get_label( partition_temp .get_path(), label_found ) ;
+			}
 			partition_temp .uuid = fs_info .get_uuid( partition_temp .get_path() ) ;
 		}
 
diff --git a/src/Utils.cc b/src/Utils.cc
index 1a72a57..eb07952 100644
--- a/src/Utils.cc
+++ b/src/Utils.cc
@@ -20,7 +20,7 @@
 
 #include <sstream>
 #include <iomanip>
-#include <regex.h>
+#include <glibmm/regex.h>
 #include <locale.h>
 
 
@@ -327,23 +327,24 @@ int Utils::execute_command( const Glib::ustring & command,
 	return exit_status ;
 }
 
-Glib::ustring Utils::regexp_label( const Glib::ustring & text,
-				const Glib::ustring & regular_sub_expression )
+Glib::ustring Utils::regexp_label( const Glib::ustring & text
+                                 , const Glib::ustring & pattern
+                                 )
 {
-	//Extract text from a regular sub-expression.  E.g., "text we don't want (text we want)"
-	Glib::ustring label = "";
-	regex_t    preg ;
-	int        nmatch = 2 ;
-	regmatch_t pmatch[  2 ] ;
-	int rc = regcomp( &preg, regular_sub_expression .c_str(), REG_EXTENDED | REG_ICASE | REG_NEWLINE ) ;
-    if(rc == 0)
-	{
-		if (regexec(&preg, text.c_str(), nmatch, pmatch, 0) == 0)
-			label = text .substr( pmatch[1].rm_so, pmatch[1].rm_eo - pmatch[1].rm_so ) ;
-
-		regfree(&preg);
-	}
-	return label ;
+	//Extract text from a regular sub-expression or pattern.
+	//  E.g., "text we don't want (text we want)"
+	std::vector<Glib::ustring> results;
+	Glib::RefPtr<Glib::Regex> myregexp =
+		Glib::Regex::create( pattern
+		                   , Glib::REGEX_CASELESS | Glib::REGEX_MULTILINE
+		                   );
+
+	results = myregexp ->split( text );
+
+	if ( results .size() >= 2 )
+		return results[ 1 ] ;
+	else
+		return "" ;
 }
 
 Glib::ustring Utils::fat_compliant_label( const Glib::ustring & label )
diff --git a/src/btrfs.cc b/src/btrfs.cc
index f7aede5..e779402 100644
--- a/src/btrfs.cc
+++ b/src/btrfs.cc
@@ -190,19 +190,18 @@ bool btrfs::resize( const Partition & partition_new, OperationDetail & operation
 
 void btrfs::read_label( Partition & partition )
 {
-        if ( ! Utils::execute_command( "btrfs-show " + partition .get_path(), output, error, true ) )
-        {
-                partition .label = Utils::regexp_label( output, "^Label ([^\n\t]*)" ) ;
-        }
-        else
-        {
-                if ( ! output .empty() )
-                        partition .messages .push_back( output ) ;
-
-                if ( ! error .empty() )
-                        partition .messages .push_back( error ) ;
-        }
+	if ( ! Utils::execute_command( "btrfs-show " + partition .get_path(), output, error, true ) )
+	{
+		partition .label = Utils::regexp_label( output, "^Label:?\\s*([^\n\t]*)\\s*uuid:" ) ;
+	}
+	else
+	{
+		if ( ! output .empty() )
+			partition .messages .push_back( output ) ;
 
+		if ( ! error .empty() )
+			partition .messages .push_back( error ) ;
+	}
 }
 
 } //GParted
diff --git a/src/ext2.cc b/src/ext2.cc
index 806c731..d2eff7f 100644
--- a/src/ext2.cc
+++ b/src/ext2.cc
@@ -1,5 +1,5 @@
 /* Copyright (C) 2004 Bart
- * Copyright (C) 2008, 2009, 2010 Curtis Gedak
+ * Copyright (C) 2008, 2009, 2010, 2011 Curtis Gedak
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -88,7 +88,7 @@ void ext2::read_label( Partition & partition )
 {
 	if ( ! Utils::execute_command( "e2label " + partition .get_path(), output, error, true ) )
 	{
-		partition .label = Utils::regexp_label( output, "^(.*)" ) ;
+		partition .label = Utils::trim( output ) ;
 	}
 	else
 	{
diff --git a/src/ext3.cc b/src/ext3.cc
index 23788a1..d9e6cd5 100644
--- a/src/ext3.cc
+++ b/src/ext3.cc
@@ -1,5 +1,5 @@
 /* Copyright (C) 2004 Bart
- * Copyright (C) 2008, 2009, 2010 Curtis Gedak
+ * Copyright (C) 2008, 2009, 2010, 2011 Curtis Gedak
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -89,7 +89,7 @@ void ext3::read_label( Partition & partition )
 {
 	if ( ! Utils::execute_command( "e2label " + partition .get_path(), output, error, true ) )
 	{
-		partition .label = Utils::regexp_label( output, "^(.*)" ) ;
+		partition .label = Utils::trim( output ) ;
 	}
 	else
 	{
diff --git a/src/ext4.cc b/src/ext4.cc
index b837c52..4f5546e 100644
--- a/src/ext4.cc
+++ b/src/ext4.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008, 2009, 2010 Curtis Gedak
+/* Copyright (C) 2008, 2009, 2010, 2011 Curtis Gedak
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -92,7 +92,7 @@ void ext4::read_label( Partition & partition )
 {
 	if ( ! Utils::execute_command( "e2label " + partition .get_path(), output, error, true ) )
 	{
-		partition .label = Utils::regexp_label( output, "^(.*)" ) ;
+		partition .label = Utils::trim( output ) ;
 	}
 	else
 	{
diff --git a/src/ntfs.cc b/src/ntfs.cc
index a57faee..ce11631 100644
--- a/src/ntfs.cc
+++ b/src/ntfs.cc
@@ -85,9 +85,9 @@ void ntfs::set_used_sectors( Partition & partition )
 
 void ntfs::read_label( Partition & partition )
 {
-	if ( ! Utils::execute_command( "ntfslabel --force " + partition .get_path(), output, error, true ) )
+	if ( ! Utils::execute_command( "ntfslabel --force " + partition .get_path(), output, error, false ) )
 	{
-		partition .label = Utils::regexp_label( output, "^(.*)" ) ;
+		partition .label = Utils::trim( output ) ;
 	}
 	else
 	{
