diff --git a/django_evolution/db/common.py b/django_evolution/db/common.py
index 3c03e07af6b24e5b3ce632b4a9dfff6fecf2b22a..b5d6ba68e89ba612d2b8362c467b75f2b7a965ff 100644
--- a/django_evolution/db/common.py
+++ b/django_evolution/db/common.py
@@ -360,7 +360,7 @@ class BaseEvolutionOperations(object):
     def create_unique_index(self, model, index_name, fields):
         qn = self.connection.ops.quote_name
 
-        self.record_index(model, fields)
+        self.record_index(model, fields, index_name=index_name, unique=True)
 
         return SQLResult([
             'CREATE UNIQUE INDEX %s ON %s (%s);'
@@ -810,6 +810,8 @@ class BaseEvolutionOperations(object):
                 '%s_%s_key' % (model._meta.db_table, fields[0].column),
                 self.connection.ops.max_name_length())
 
+        assert index_name or not unique
+
         add_index_to_database_sig(self, self.database_sig, model, fields,
                                   index_name=index_name, unique=unique)
 
diff --git a/django_evolution/mutators.py b/django_evolution/mutators.py
index 0ef42c34bf2ea092c4c8f6364b29bdabd3b3b45f..ba3610c41ba8f00ccd3e980da4599787d7c87339 100644
--- a/django_evolution/mutators.py
+++ b/django_evolution/mutators.py
@@ -3,9 +3,10 @@ import logging
 
 from django_evolution.db import EvolutionOperationsMulti
 from django_evolution.errors import CannotSimulate
-from django_evolution.mutations import (AddField, ChangeField, DeleteField,
-                                        MockModel, MonoBaseMutation,
-                                        MutateModelField, RenameField)
+from django_evolution.mutations import (AddField, ChangeField, ChangeMeta,
+                                        DeleteField, MockModel,
+                                        MonoBaseMutation, MutateModelField,
+                                        RenameField)
 from django_evolution.utils import get_database_for_model_name
 
 
@@ -390,6 +391,7 @@ class AppMutator(object):
             deleted_fields = set()
             noop_fields = set()
             model_names = set()
+            unique_together = {}
             last_change_mutations = {}
             renames = {}
 
@@ -507,6 +509,15 @@ class AppMutator(object):
                         self._rename_dict_key(last_change_mutations,
                                               mutation.new_field_name,
                                               mutation.old_field_name)
+                elif isinstance(mutation, ChangeMeta):
+                    if (mutation.prop_name == 'unique_together' and
+                        mutation.model_name not in unique_together):
+                        # This is the most recent unique_together change
+                        # for this model, which wins, since each ChangeMeta
+                        # is expected to contain the full resulting value
+                        # of the property.
+                        unique_together[mutation.model_name] = \
+                            mutation.new_value
 
                 if remove_mutation:
                     removed_mutations.add(mutation)
@@ -534,7 +545,7 @@ class AppMutator(object):
             #
             # 3) Change the field name on any fields from processable rename
             #    entries.
-            if noop_fields or renames:
+            if noop_fields or renames or unique_together:
                 for mutation in mutations:
                     remove_mutation = False
 
@@ -607,6 +618,17 @@ class AppMutator(object):
                             # include only this one.
                             removed_mutations.update(rename_mutations[:-1])
                             rename_info['mutations'] = [rename_mutations[-1]]
+                    elif isinstance(mutation, ChangeMeta):
+                        if (mutation.prop_name == 'unique_together' and
+                            mutation.model_name in unique_together):
+                            # This was a previously found unique_together.
+                            # We'll check if the value matches the winning
+                            # value from before. If not, we'll discard this
+                            # mutation.
+                            value = unique_together[mutation.model_name]
+
+                            if mutation.new_value != value:
+                                remove_mutation = True
 
                     if remove_mutation:
                         removed_mutations.add(mutation)
diff --git a/django_evolution/tests/db/mysql.py b/django_evolution/tests/db/mysql.py
index fc58412b0954bb87e66de1915d16027a93501969..8d0231a0d15e5c12138458e312e97b9dcd0a00eb 100644
--- a/django_evolution/tests/db/mysql.py
+++ b/django_evolution/tests/db/mysql.py
@@ -573,6 +573,14 @@ unique_together = {
         'DROP INDEX `int_field1` ON `tests_testmodel`;',
     ]),
 
+    'set_remove': '\n'.join([
+        'CREATE UNIQUE INDEX %s'
+        ' ON tests_testmodel (`int_field1`, `char_field1`);'
+        % generate_index_name('tests_testmodel',
+                              ['int_field1', 'char_field1'],
+                              default=False),
+    ]),
+
     'ignore_missing_indexes': (
         'CREATE UNIQUE INDEX %s'
         ' ON tests_testmodel (`char_field1`, `char_field2`);'
diff --git a/django_evolution/tests/db/postgresql.py b/django_evolution/tests/db/postgresql.py
index 1aa6bbf4a82cc440f9cfe28c8963b1c4bab05144..0de37987fdf433851bf63efd5153cce03c3a9bb8 100644
--- a/django_evolution/tests/db/postgresql.py
+++ b/django_evolution/tests/db/postgresql.py
@@ -576,6 +576,14 @@ unique_together = {
         ' DROP CONSTRAINT tests_testmodel_int_field1_char_field1_key;'
     ),
 
+    'set_remove': (
+        'CREATE UNIQUE INDEX %s'
+        ' ON tests_testmodel ("int_field1", "char_field1");'
+        % generate_index_name('tests_testmodel',
+                              ['int_field1', 'char_field1'],
+                              default=False)
+    ),
+
     'ignore_missing_indexes': (
         'CREATE UNIQUE INDEX %s'
         ' ON tests_testmodel ("char_field1", "char_field2");'
diff --git a/django_evolution/tests/db/sqlite3.py b/django_evolution/tests/db/sqlite3.py
index 6c79f7a19de7ce8b8df751429d55dc0219f41b90..31dde6c64aa597c3fe4b3c967b4f4172d4d93331 100644
--- a/django_evolution/tests/db/sqlite3.py
+++ b/django_evolution/tests/db/sqlite3.py
@@ -2827,6 +2827,14 @@ unique_together = {
         'DROP TABLE "TEMP_TABLE";',
     ]),
 
+    'set_remove': '\n'.join([
+        'CREATE UNIQUE INDEX %s'
+        ' ON tests_testmodel ("int_field1", "char_field1");'
+        % generate_index_name('tests_testmodel',
+                              ['int_field1', 'char_field1'],
+                              default=False),
+    ]),
+
     'ignore_missing_indexes': (
         'CREATE UNIQUE INDEX %s'
         ' ON tests_testmodel ("char_field1", "char_field2");'
diff --git a/django_evolution/tests/test_unique_together.py b/django_evolution/tests/test_unique_together.py
index df26605d0cc14572ebe3ca345960dcb185912757..a65305160a0ce4388712cea9691891b5d578ca65 100644
--- a/django_evolution/tests/test_unique_together.py
+++ b/django_evolution/tests/test_unique_together.py
@@ -150,6 +150,36 @@ class UniqueTogetherTests(EvolutionTestCase):
             ],
             'removing')
 
+    def test_set_remove(self):
+        """Testing ChangeMeta(unique_together) and setting indexes and removing
+        one
+        """
+        class DestModel(models.Model):
+            int_field1 = models.IntegerField()
+            int_field2 = models.IntegerField()
+            char_field1 = models.CharField(max_length=20)
+            char_field2 = models.CharField(max_length=40)
+
+            class Meta:
+                unique_together = [('int_field1', 'char_field1')]
+
+        self.set_base_model(NoUniqueTogetherBaseModel)
+        self.perform_evolution_tests(
+            DestModel,
+            [
+                ChangeMeta('TestModel', 'unique_together',
+                           [('int_field1', 'char_field1'),
+                            ('int_field2', 'char_field2')]),
+                ChangeMeta('TestModel', 'unique_together',
+                           [('int_field1', 'char_field1')])
+            ],
+            self.DIFF_TEXT,
+            [
+                "ChangeMeta('TestModel', 'unique_together',"
+                " [('int_field1', 'char_field1')])"
+            ],
+            'set_remove')
+
     def test_missing_indexes(self):
         """Testing ChangeMeta(unique_together) and old missing indexes"""
         class DestModel(models.Model):
