diff --git a/help/C/gparted.xml b/help/C/gparted.xml
index a4c1017..0900725 100644
--- a/help/C/gparted.xml
+++ b/help/C/gparted.xml
@@ -1133,6 +1133,30 @@
               Choose:
               <menuchoice><guimenu>Partition</guimenu><guimenuitem>New UUID</guimenuitem></menuchoice>.
               </para>
+              <para>
+              For NTFS filesystems only, the application opens a <guilabel>Set new filesystem UUID on
+	      <replaceable>/path-to-partition</replaceable></guilabel> dialog.
+              </para>
+            </listitem>
+            <listitem>
+              <para>
+              (NTFS filesystems only). The Dialog offers the choice between setting the entire UUID,
+	      or setting only half of the UUID (actually: the NTFS Volume Serial Number).
+              </para>
+              <para>
+	      If the partition will be, or continue to be used as a system partition on the same machine,
+	      using the same Windows license, then only half of the UUID (NTFS Volume Serial Number)
+	      should be changed, as the other half is used in Windows Product Activation.
+              </para>
+              <note>
+	        <para>
+	        For NTFS filesystems, what GParted names, and treats as, the UUID, is in fact the Volume Serial Number.
+                </para>
+                <para>
+	        The real UUID of the NTFS filesystem is another number altogether.
+	        It cannot and will not be changed by GParted. It should not even be changed.
+                </para>
+	    </note>
             </listitem>
           </orderedlist>
         </para>
diff --git a/include/Dialog_Partition_ChangeUUID.h b/include/Dialog_Partition_ChangeUUID.h
new file mode 100644
index 0000000..265aa90
--- /dev/null
+++ b/include/Dialog_Partition_ChangeUUID.h
@@ -0,0 +1,51 @@
+/* Copyright (C) 2012 Rogier Goossens
+ *
+ *  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
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+ 
+#ifndef DIALOG_PARTITION_CHANGEUUID_H_
+#define DIALOG_PARTITION_CHANGEUUID_H_
+
+#include "../include/Partition.h"
+#include "../include/i18n.h"
+
+#include <gtkmm/dialog.h>
+#include <gtkmm/stock.h>
+#include <gtkmm/frame.h>
+#include <gtkmm/table.h>
+#include <gtkmm/entry.h>
+
+#define BORDER 8
+ 
+namespace GParted
+{ 
+
+class Dialog_Partition_ChangeUUID : public Gtk::Dialog
+{
+public:
+	Dialog_Partition_ChangeUUID( const Partition & partition );
+	~Dialog_Partition_ChangeUUID();
+
+	Glib::ustring get_new_uuid();
+private:
+	Gtk::Table param_table;
+	Gtk::RadioButtonGroup ntfs_full_half_group;
+	Gtk::RadioButton ntfs_full_uuid;
+	Gtk::RadioButton ntfs_half_uuid;
+};
+
+} //GParted
+
+#endif //DIALOG_PARTITION_CHANGEUUID_H_
diff --git a/include/Utils.h b/include/Utils.h
index 4cdad54..04ddca6 100644
--- a/include/Utils.h
+++ b/include/Utils.h
@@ -48,6 +48,9 @@ const Byte_Value MEBIBYTE=(KIBIBYTE * KIBIBYTE);
 const Byte_Value GIBIBYTE=(MEBIBYTE * KIBIBYTE);
 const Byte_Value TEBIBYTE=(GIBIBYTE * KIBIBYTE);
 
+const Glib::ustring UUID_RANDOM = _("(New UUID - will be randomly generated)") ;
+const Glib::ustring UUID_RANDOM_NTFS_HALF = _("(Half new UUID - will be randomly generated)") ;
+
 enum FILESYSTEM
 {
 	FS_UNALLOCATED	= 0,
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 145db1e..6e645c1 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,8 +1,10 @@
 # List of source files containing translatable strings.
 # Please keep this file sorted alphabetically.
 gparted.desktop.in.in
+include/Utils.h
 src/Dialog_Base_Partition.cc
 src/Dialog_Disklabel.cc
+src/Dialog_Partition_ChangeUUID.cc
 src/Dialog_Partition_Copy.cc
 src/Dialog_Partition_Info.cc
 src/Dialog_Partition_Label.cc
@@ -16,6 +18,7 @@ src/DMRaid.cc
 src/FileSystem.cc
 src/GParted_Core.cc
 src/HBoxOperations.cc
+src/OperationChangeUUID.cc
 src/OperationCopy.cc
 src/OperationCheck.cc
 src/OperationCreate.cc
@@ -23,7 +26,6 @@ src/OperationDelete.cc
 src/OperationFormat.cc
 src/OperationLabelPartition.cc
 src/OperationResizeMove.cc
-src/OperationChangeUUID.cc
 src/Partition.cc
 src/TreeView_Detail.cc
 src/Utils.cc
diff --git a/src/Dialog_Partition_ChangeUUID.cc b/src/Dialog_Partition_ChangeUUID.cc
new file mode 100644
index 0000000..8edf6ca
--- /dev/null
+++ b/src/Dialog_Partition_ChangeUUID.cc
@@ -0,0 +1,97 @@
+/* Copyright (C) 2012 Rogier Goossens
+ *
+ *  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
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+ 
+#include "../include/Dialog_Partition_ChangeUUID.h"
+
+namespace GParted
+{
+
+Dialog_Partition_ChangeUUID::Dialog_Partition_ChangeUUID( const Partition & partition )
+{
+	this ->set_resizable( false ) ;
+	this ->set_has_separator( false ) ;
+	
+	/*TO TRANSLATORS: dialog title, looks like Set filesystem UUID on /dev/hda3 */
+	this ->set_title( String::ucompose( _("Set new filesystem UUID on %1"), partition .get_path() ) );
+
+	{
+		int top = 0, bottom = 1;
+
+		param_table .set_border_width(5);
+		param_table .set_row_spacings(10);
+		param_table .set_col_spacings(10);
+		get_vbox()->pack_start(param_table, Gtk::PACK_EXPAND_PADDING);
+
+		//This should *always* be done, even for non-NTFS partitions.
+		ntfs_full_uuid .set_label( _("Set new UUID") ) ;
+		/*TO TRANSLATORS: In order to avoid confusion, the translation of the term 'second half' here should match the one in the long message */
+		ntfs_half_uuid .set_label( _("Set second half of UUID only") ) ;
+		ntfs_full_uuid .set_group( ntfs_full_half_group ) ;
+		ntfs_half_uuid .set_group( ntfs_full_half_group ) ;
+		ntfs_full_uuid .set_active( true );
+
+		//TODO: is the full serial number on FAT devices also used for product activation ????
+		if ( partition .filesystem == GParted::FS_NTFS ) {
+			Gtk::Label * label ;
+
+			/*TO TRANSLATORS: In order to avoid confusion, the translation of the term 'second half' here should match the one in the radio button label */
+			Glib::ustring warning = _("The first half of the NTFS UUID (or in fact, for NTFS, it is the Volume Serial Number)"
+						  " is used in the Windows product activation. If this partition will be used as"
+						  " system partition on the same machine, using the same windows license, only the second"
+						  " half of the UUID should be set to a new value.");
+
+			label = Utils::mk_label("<b>" + Glib::ustring( _("Warning:") ) + "</b>") ;
+			param_table .attach( *label, 0, 2, top++, bottom++, Gtk::FILL);
+
+			label = Utils::mk_label(Glib::ustring( warning )) ;
+			label ->set_line_wrap( true ) ;
+			label ->set_justify( Gtk::JUSTIFY_FILL ) ;
+			param_table .attach( *label, 0, 2, top++, bottom++, Gtk::FILL);
+
+			param_table .attach( ntfs_full_uuid, 0, 1, top, bottom, Gtk::FILL ) ;
+			param_table .attach( ntfs_half_uuid, 1, 2, top, bottom, Gtk::FILL ) ;
+			top++ ; bottom ++ ;
+		} else {
+			// This shouldn't happen, but just in case.
+			/*TO TRANSLATORS: message to indicate that there are no details to specify when setting the UUID to a random value */
+			Glib::ustring message = _("There are no options for setting the Filesystem UUID to a random value.") ;
+			param_table .attach(*Utils::mk_label("<b>" + Glib::ustring( message ) + "</b>"),
+					    0, 2,
+					    top++, bottom++,
+					    Gtk::FILL);
+		}
+	}
+
+	this ->add_button( Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL ) ;
+	this ->add_button( Gtk::Stock::OK, Gtk::RESPONSE_OK ) ;
+	this ->set_default_response( Gtk::RESPONSE_OK ) ;
+	this ->show_all_children() ;
+}
+
+Dialog_Partition_ChangeUUID::~Dialog_Partition_ChangeUUID()
+{
+}
+
+Glib::ustring Dialog_Partition_ChangeUUID::get_new_uuid()
+{
+	if ( ntfs_full_uuid .get_active() )
+		return UUID_RANDOM ;
+	else
+		return UUID_RANDOM_NTFS_HALF ;
+}
+
+} //GParted
diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc
index b7e5851..38ed1ea 100644
--- a/src/GParted_Core.cc
+++ b/src/GParted_Core.cc
@@ -1773,10 +1773,17 @@ bool GParted_Core::label_partition( const Partition & partition, OperationDetail
 
 bool GParted_Core::change_uuid( const Partition & partition, OperationDetail & operationdetail )
 {
-	operationdetail .add_child( OperationDetail( String::ucompose(
-									_("Set UUID on %1 to a new, random value"),
-									 partition .get_path()
-								 ) ) ) ;
+	if ( partition .uuid == UUID_RANDOM_NTFS_HALF ) {
+		operationdetail .add_child( OperationDetail( String::ucompose(
+										_("Set half of the UUID on %1 to a new, random value"),
+										 partition .get_path()
+									 ) ) ) ;
+	} else {
+		operationdetail .add_child( OperationDetail( String::ucompose(
+										_("Set UUID on %1 to a new, random value"),
+										 partition .get_path()
+									 ) ) ) ;
+	}
 
 	bool succes = false ;
 	if ( partition .type != TYPE_EXTENDED )
diff --git a/src/Makefile.am b/src/Makefile.am
index 3ad2477..fa424e5 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -15,6 +15,7 @@ gpartedbin_SOURCES = \
 	Dialog_Base_Partition.cc	\
 	Dialog_Disklabel.cc 		\
 	Dialog_Rescue_Data.cc		\
+	Dialog_Partition_ChangeUUID.cc	\
 	Dialog_Partition_Copy.cc	\
 	Dialog_Partition_Info.cc	\
 	Dialog_Partition_Label.cc	\
@@ -32,6 +33,7 @@ gpartedbin_SOURCES = \
 	GParted_Core.cc			\
 	HBoxOperations.cc		\
 	Operation.cc			\
+	OperationChangeUUID.cc		\
 	OperationCopy.cc		\
 	OperationCheck.cc		\
 	OperationCreate.cc		\
@@ -39,7 +41,6 @@ gpartedbin_SOURCES = \
 	OperationDetail.cc		\
 	OperationFormat.cc		\
 	OperationResizeMove.cc		\
-	OperationChangeUUID.cc		\
 	OperationLabelPartition.cc	\
 	Partition.cc			\
 	Proc_Partitions_Info.cc		\
diff --git a/src/OperationChangeUUID.cc b/src/OperationChangeUUID.cc
index eaa61a3..f7c0b30 100644
--- a/src/OperationChangeUUID.cc
+++ b/src/OperationChangeUUID.cc
@@ -15,6 +15,7 @@
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
+#include "../include/Utils.h"
 #include "../include/OperationChangeUUID.h"
 
 namespace GParted
@@ -54,10 +55,17 @@ void OperationChangeUUID::apply_to_visual( std::vector<Partition> & partitions )
 
 void OperationChangeUUID::create_description()
 {
-	/*TO TRANSLATORS: looks like   Set a new random UUID on (ext4) filesystem on /dev/sda1 */
-	description = String::ucompose( _("Set a new random UUID on filesystem (%1) on %2"),
-					Utils::get_filesystem_string( partition_new .filesystem ),
-					partition_new .get_path() ) ;
+	if ( partition_new .uuid == UUID_RANDOM_NTFS_HALF ) {
+		/*TO TRANSLATORS: looks like   Set half the UUID to a new, random value on ntfs filesystem on /dev/sda1 */
+		description = String::ucompose( _("Set half the UUID to a new, random value on %1 filesystem on %2"),
+						Utils::get_filesystem_string( partition_new .filesystem ),
+						partition_new .get_path() ) ;
+	} else {
+		/*TO TRANSLATORS: looks like   Set a new random UUID on ext4 filesystem on /dev/sda1 */
+		description = String::ucompose( _("Set a new random UUID on %1 filesystem on %2"),
+						Utils::get_filesystem_string( partition_new .filesystem ),
+						partition_new .get_path() ) ;
+	}
 }
 
 } //GParted
diff --git a/src/Win_GParted.cc b/src/Win_GParted.cc
index 6db904d..27b9c90 100644
--- a/src/Win_GParted.cc
+++ b/src/Win_GParted.cc
@@ -22,6 +22,7 @@
 #include "../include/Dialog_Disklabel.h"
 #include "../include/Dialog_Rescue_Data.h"
 #include "../include/Dialog_Partition_Resize_Move.h"
+#include "../include/Dialog_Partition_ChangeUUID.h"
 #include "../include/Dialog_Partition_Copy.h"
 #include "../include/Dialog_Partition_New.h"
 #include "../include/Dialog_Partition_Info.h"
@@ -767,7 +768,10 @@ bool Win_GParted::Merge_Operations( unsigned int first, unsigned int second )
 	          operations[ first ]->partition_new == operations[ second ]->partition_original
 	        )
 	{
-		operations[ first ]->partition_new.uuid = operations[ second ]->partition_new.uuid;
+		// Changing half the UUID should not override changing all of it
+		if ( operations[ first ]->partition_new.uuid == UUID_RANDOM_NTFS_HALF ||
+		     operations[ second ]->partition_new.uuid == UUID_RANDOM )
+			operations[ first ]->partition_new.uuid = operations[ second ]->partition_new.uuid;
 		operations[ first ]->create_description() ;
 		remove_operation( second );
 
@@ -2359,6 +2363,15 @@ void Win_GParted::activate_label_partition()
 	
 void Win_GParted::activate_change_uuid()
 {
+	Dialog_Partition_ChangeUUID dialog( selected_partition );
+	dialog .set_transient_for( *this );
+
+	if ( selected_partition .filesystem == GParted::FS_NTFS ) {
+		if ( dialog .run() != Gtk::RESPONSE_OK )
+			return ;
+		dialog .hide() ;
+	}
+
 	//Make a duplicate of the selected partition (used in UNDO)
 	Partition part_temp ;
 	part_temp .Set( devices[ current_device ] .get_path(),
@@ -2373,7 +2386,13 @@ void Win_GParted::activate_change_uuid()
 			false ) ;
 
 	part_temp .label = selected_partition .label ;
-	part_temp .uuid = _("(New UUID - will be randomly generated)") ;
+
+	if ( part_temp .filesystem == GParted::FS_NTFS ) {
+		part_temp .uuid = dialog .get_new_uuid() ;
+	} else {
+		part_temp .uuid = UUID_RANDOM ;
+	}
+
 
 	Operation * operation = new OperationChangeUUID( devices[ current_device ],
 								selected_partition, part_temp ) ;
diff --git a/src/ntfs.cc b/src/ntfs.cc
index 7223cb5..0a8b79f 100644
--- a/src/ntfs.cc
+++ b/src/ntfs.cc
@@ -34,8 +34,25 @@ FS ntfs::get_filesystem_support()
 	}
 
 	if ( ! Glib::find_program_in_path( "ntfslabel" ) .empty() ) {
+		Glib::ustring version ;
+
 		fs .read_label = FS::EXTERNAL ;
 		fs .write_label = FS::EXTERNAL ;
+
+		//ntfslabel --version exits with non-zero error code (1)
+		Utils::execute_command( "ntfslabel --version ", output, error, false ) ;
+
+		if ( ! ( version = Utils::regexp_label( output, "ntfslabel ([^[:blank:]]+) +\\(libntfs-3g\\)" ) ) .empty() ) {
+			int year ;
+			int n ;
+
+			// Only the year is needed, but make sure the version has the expected format ...
+			if ( 2 == sscanf( version .c_str(), "%*[a-zA-Z]%d.%*d.%*d%*[a-zA-Z].%d", & year, & n ) )
+				// TODO: In case I forget: the year should be >= 2012. 2011 just used for testing.
+				if ( year >= 2011 )
+					 // Any 2012 release and later will do
+					fs .write_uuid = FS::EXTERNAL ;
+		}
 	}
 
 	if ( ! Glib::find_program_in_path( "mkntfs" ) .empty() )
@@ -110,6 +127,13 @@ void ntfs::read_uuid( Partition & partition )
 
 bool ntfs::write_uuid( const Partition & partition, OperationDetail & operationdetail )
 {
+	if ( partition .uuid == UUID_RANDOM_NTFS_HALF ) {
+		// TODO: option names '-i' and '-I' are temporary. Fix when definitive names are known
+		return ! execute_command( "ntfslabel -i " + partition .get_path(), operationdetail ) ;
+	} else {
+		// TODO: option names '-i' and '-I' are temporary. Fix when definitive names are known
+		return ! execute_command( "ntfslabel -I " + partition .get_path(), operationdetail ) ;
+	}
 	return true ;
 }
 
