diff --git a/src/Utils.cc b/src/Utils.cc
index 1a72a57..571e089 100644
--- a/src/Utils.cc
+++ b/src/Utils.cc
@@ -168,6 +168,7 @@ Glib::ustring Utils::get_filesystem_software( FILESYSTEM filesystem )
 	switch( filesystem )
 	{
 		case FS_BTRFS       : return "btrfs-tools" ;
+		case FS_EXFAT       : return "exfat-utils" ;
 		case FS_EXT2        : return "e2fsprogs" ;
 		case FS_EXT3        : return "e2fsprogs" ;
 		case FS_EXT4        : return "e2fsprogs v1.41+" ;
diff --git a/src/exfat.cc b/src/exfat.cc
index e0dfcff..fccc20c 100644
--- a/src/exfat.cc
+++ b/src/exfat.cc
@@ -24,31 +24,74 @@ namespace GParted
 FS exfat::get_filesystem_support()
 {
 	FS fs ;
-	
 	fs .filesystem = FS_EXFAT ;
-	
-	fs .copy = FS::GPARTED ;
-	fs .move = FS::GPARTED ;
-	
+
+	if ( ! Glib::find_program_in_path( "dumpexfat" ) .empty() )
+		fs .read = FS::EXTERNAL ;
+
+	if ( ! Glib::find_program_in_path( "exfatlabel" ) .empty() )
+	{
+		fs .read_label = FS::EXTERNAL ;
+		fs .write_label = FS::EXTERNAL ;
+	}
+
+	if ( ! Glib::find_program_in_path( "mkexfatfs" ) .empty() )
+		fs .create = GParted::FS::EXTERNAL ;
+
+	if ( ! Glib::find_program_in_path( "exfatfsck" ) .empty() )
+		fs .check = GParted::FS::EXTERNAL ;
+
+	if ( fs .check )
+	{
+		fs .copy = GParted::FS::GPARTED ;
+		fs .move = GParted::FS::GPARTED ;
+	}
+
 	return fs ;
 }
 
 void exfat::set_used_sectors( Partition & partition )
 {
+	if ( ! Utils::execute_command( "dumpexfat " + partition .get_path(), output, error, true ) )
+	{
+		Glib::ustring free_sectors = Utils::regexp_label( output, "^Free sectors[^0-9]([^\n]*)" ) ;
+
+		partition .Set_Unused( Utils::convert_to_int( free_sectors ) ) ;
+	}
+	else
+	{
+		if ( ! output .empty() )
+			partition .messages .push_back( output ) ;
+
+		if ( ! error .empty() )
+			partition .messages .push_back( error ) ;
+	}
 }
 
 void exfat::read_label( Partition & partition )
 {
+	if ( ! Utils::execute_command( "exfatlabel " + partition .get_path(), output, error, true ) )
+	{
+		partition .label = Utils::regexp_label( output, "^([^\n\t]*)" ) ;
+	}
+	else
+	{
+		if ( ! output .empty() )
+			partition .messages .push_back( output ) ;
+
+		if ( ! error .empty() )
+			partition .messages .push_back( error ) ;
+	}
 }
 
 bool exfat::write_label( const Partition & partition, OperationDetail & operationdetail )
 {
-	return true ;
+	return ! execute_command( "exfatlabel -v " + partition .get_path() + " \"" + partition .label + "\"", operationdetail ) ;
 }
 
 bool exfat::create( const Partition & new_partition, OperationDetail & operationdetail )
 {
-	return true ;
+	return (! execute_command( "mkexfatfs -n \"" + new_partition .label + "\" " + new_partition .get_path(), operationdetail ) );
 }
 
 bool exfat::resize( const Partition & partition_new
@@ -76,7 +119,7 @@ bool exfat::copy( const Glib::ustring & src_part_path
 
 bool exfat::check_repair( const Partition & partition, OperationDetail & operationdetail )
 {
-	return true ;
+	return (! execute_command( "exfatfsck " + partition .get_path(), operationdetail )) ;
 }
 
 } //GParted
