Index: django/core/management/commands/syncdb.py
===================================================================
--- django/core/management/commands/syncdb.py	(revision 8308)
+++ django/core/management/commands/syncdb.py	(working copy)
@@ -61,6 +61,9 @@
             app_name = app.__name__.split('.')[-2]
             model_list = models.get_models(app)
             for model in model_list:
+                # Add model defined schema tables if anny
+                if connection.features.supports_schemas and model._meta.db_schema:
+                    tables += connection.introspection.schema_table_names(model._meta.db_schema)
                 # Create the model's database table, if it doesn't already exist.
                 if verbosity >= 2:
                     print "Processing %s.%s model" % (app_name, model._meta.object_name)
Index: django/core/management/sql.py
===================================================================
--- django/core/management/sql.py	(revision 8308)
+++ django/core/management/sql.py	(working copy)
@@ -72,7 +72,7 @@
 
     # Figure out which tables already exist
     if cursor:
-        table_names = connection.introspection.get_table_list(cursor)
+        table_names = connection.introspection.get_table_list(cursor)    
     else:
         table_names = []
 
@@ -84,6 +84,9 @@
     references_to_delete = {}
     app_models = models.get_models(app)
     for model in app_models:
+        # Find aditional tables in model defined schemas
+        if connection.features.supports_schemas and model._meta.db_schema:
+            table_names += connection.introspection.get_schema_table_list(cursor, model._meta.db_schema) 
         if cursor and connection.introspection.table_name_converter(model._meta.db_table) in table_names:
             # The table exists, so it needs to be dropped
             opts = model._meta
Index: django/db/backends/__init__.py
===================================================================
--- django/db/backends/__init__.py	(revision 8308)
+++ django/db/backends/__init__.py	(working copy)
@@ -55,6 +55,7 @@
     update_can_self_select = True
     interprets_empty_strings_as_nulls = False
     can_use_chunked_reads = True
+    supports_schemas = False
 
 class BaseDatabaseOperations(object):
     """
@@ -345,6 +346,14 @@
         "Returns a list of names of all tables that exist in the database."
         cursor = self.connection.cursor()
         return self.get_table_list(cursor)
+        
+    def schema_table_names(self, schema):
+        "Returns a list of names of all tables that exist in the database schema."
+        if self.connection.features.supports_schemas:
+            cursor = self.connection.cursor()
+            return self.get_schema_table_list(cursor, schema)
+        else:
+            return []
 
     def django_table_names(self, only_existing=False):
         """
Index: django/db/backends/creation.py
===================================================================
--- django/db/backends/creation.py	(revision 8308)
+++ django/db/backends/creation.py	(working copy)
@@ -243,8 +243,14 @@
                     tablespace_sql = ''
             else:
                 tablespace_sql = ''
+            # Use original db_table in index name if schema is provided
+            if self.connection.features.supports_schemas and model._meta.db_schema:
+                index_table_name = model._meta._db_table
+            else:
+                index_table_name = model._meta.db_table
+                
             output = [style.SQL_KEYWORD('CREATE INDEX') + ' ' +
-                style.SQL_TABLE(qn('%s_%s' % (model._meta.db_table, f.column))) + ' ' +
+                style.SQL_TABLE(qn('%s_%s' % (index_table_name, f.column))) + ' ' +
                 style.SQL_KEYWORD('ON') + ' ' +
                 style.SQL_TABLE(qn(model._meta.db_table)) + ' ' +
                 "(%s)" % style.SQL_FIELD(qn(f.column)) +
Index: django/db/backends/mysql/base.py
===================================================================
--- django/db/backends/mysql/base.py	(revision 8308)
+++ django/db/backends/mysql/base.py	(working copy)
@@ -67,6 +67,7 @@
 class DatabaseFeatures(BaseDatabaseFeatures):
     empty_fetchmany_value = ()
     update_can_self_select = False
+    supports_schemas = True
 
 class DatabaseOperations(BaseDatabaseOperations):
     def date_extract_sql(self, lookup_type, field_name):
@@ -99,7 +100,8 @@
     def quote_name(self, name):
         if name.startswith("`") and name.endswith("`"):
             return name # Quoting once is enough.
-        return "`%s`" % name
+        # add support for tablenames passed that also have their schema in their name
+        return "`%s`" % name.replace('.','`.`') 
 
     def random_function_sql(self):
         return 'RAND()'
Index: django/db/backends/mysql/introspection.py
===================================================================
--- django/db/backends/mysql/introspection.py	(revision 8308)
+++ django/db/backends/mysql/introspection.py	(working copy)
@@ -31,6 +31,10 @@
         "Returns a list of table names in the current database."
         cursor.execute("SHOW TABLES")
         return [row[0] for row in cursor.fetchall()]
+    
+    def get_schema_table_list(self, cursor, schema):
+        cursor.execute("SHOW TABLES FROM %s" % self.connection.ops.quote_name(schema))
+        return [schema + "." + row[0] for row in cursor.fetchall()]
 
     def get_table_description(self, cursor, table_name):
         "Returns a description of the table, with the DB-API cursor.description interface."
Index: django/db/models/options.py
===================================================================
--- django/db/models/options.py	(revision 8308)
+++ django/db/models/options.py	(working copy)
@@ -21,7 +21,7 @@
 DEFAULT_NAMES = ('verbose_name', 'db_table', 'ordering',
                  'unique_together', 'permissions', 'get_latest_by',
                  'order_with_respect_to', 'app_label', 'db_tablespace',
-                 'abstract')
+                 'abstract', 'db_schema')
 
 class Options(object):
     def __init__(self, meta, app_label=None):
@@ -29,6 +29,7 @@
         self.module_name, self.verbose_name = None, None
         self.verbose_name_plural = None
         self.db_table = ''
+        self.db_schema = ''
         self.ordering = []
         self.unique_together =  []
         self.permissions =  []
@@ -89,13 +90,21 @@
         else:
             self.verbose_name_plural = string_concat(self.verbose_name, 's')
         del self.meta
+        
+                
 
         # If the db_table wasn't provided, use the app_label + module_name.
         if not self.db_table:
-            self.db_table = "%s_%s" % (self.app_label, self.module_name)
+            self.db_table = "%s_%s" % (self.app_label, self.module_name)    
             self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
-
-
+        
+        # Patch db_table with the schema if provided and allowed
+        if self.db_schema and connection.features.supports_schemas:
+            # Store original db_table in a save place first
+            self._db_table = self.db_table
+            self.db_table = "%s.%s" % (self.db_schema, self.db_table)
+    
+    
     def _prepare(self, model):
         if self.order_with_respect_to:
             self.order_with_respect_to = self.get_field(self.order_with_respect_to)
