diff --git a/src/btrfs.cc b/src/btrfs.cc
index 0cd39a3..e0a2963 100644
--- a/src/btrfs.cc
+++ b/src/btrfs.cc
@@ -1,5 +1,5 @@
 /* Copyright (C) 2009,2010 Luca Bruno <lucab@debian.org>
- * Copyright (C) 2010 Curtis Gedak
+ * Copyright (C) 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
@@ -39,6 +39,15 @@ FS btrfs::get_filesystem_support()
 	if ( ! Glib::find_program_in_path( "btrfsck" ) .empty() )
 		fs .check = GParted::FS::EXTERNAL ;
 
+	if ( ! Glib::find_program_in_path( "btrfsctl" ) .empty() && fs .check )
+	{
+		fs .grow = FS::EXTERNAL ;
+
+		if ( fs .read ) //needed to determine a min file system size.
+			fs .shrink = FS::EXTERNAL ;
+	}
+
+
 	if ( fs .check )
 	{
 		fs .copy = GParted::FS::GPARTED ;
@@ -125,8 +134,56 @@ bool btrfs::copy( const Glib::ustring & src_part_path,
 
 bool btrfs::resize( const Partition & partition_new, OperationDetail & operationdetail, bool fill_partition )
 {
-// TODO
-        return true ;
+	bool exit_status = false ;
+
+	//Create directory
+	Glib::ustring str_temp = _( "create temporary directory" ) ;
+	operationdetail .add_child( OperationDetail( str_temp, STATUS_NONE, FONT_BOLD_ITALIC ) ) ;
+	char dtemplate[] = "/tmp/gparted-XXXXXXXX" ;
+	Glib::ustring dname =  mkdtemp( dtemplate ) ;
+	if( dname .empty() )
+	{
+		//Failed to create temporary directory
+		str_temp = _( "Failed to create temporary directory." );
+		operationdetail .get_last_child() .add_child( OperationDetail( str_temp, STATUS_NONE, FONT_ITALIC ) ) ;
+		return false ;
+	}
+
+	/*TO TRANSLATORS: looks like  Created temporary directory /tmp/gparted-XXCOOO8U */
+	str_temp = String::ucompose ( _("Created temporary directory %1"), dname ) ;
+	operationdetail .get_last_child() .add_child( OperationDetail( str_temp, STATUS_NONE, FONT_ITALIC ) ) ;
+
+	//Mount file system.  Needed to resize btrfs.
+	str_temp = "mount " + partition_new .get_path() + " " + dname ;
+	exit_status = ! execute_command( str_temp, operationdetail ) ;
+
+	if ( exit_status )
+	{
+		//Build resize command
+		str_temp = "btrfsctl" ;
+		if ( ! fill_partition )
+		{
+			str_temp += " -r " + Utils::num_to_str( floor( Utils::sector_to_unit(
+						partition_new .get_sector_length(), partition_new .sector_size, UNIT_KIB ) ) -1 ) + "K" ;
+		}
+		else
+			str_temp += " -r max" ;
+		str_temp += " " + dname ;
+
+		//Execute the command
+		exit_status = execute_command( str_temp, operationdetail ) ;
+
+		//Always unmount the file system
+		str_temp = "umount " + dname ;
+		execute_command( str_temp, operationdetail ) ;
+
+	}
+
+	//Always remove the temporary directory name
+	str_temp = "rmdir " + dname ;
+	execute_command( str_temp, operationdetail ) ;
+
+	return exit_status ;
 }
 
 void btrfs::read_label( Partition & partition )
