http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java
index ecabd2f..7560e2f 100644
--- a/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java
@@ -27,21 +27,20 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.auth.Permission;
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.ColumnDefinition;
-import org.apache.cassandra.config.Schema;
 import org.apache.cassandra.cql3.CFName;
 import org.apache.cassandra.cql3.ColumnIdentifier;
 import org.apache.cassandra.cql3.IndexName;
-import org.apache.cassandra.cql3.Validation;
 import org.apache.cassandra.db.marshal.MapType;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.exceptions.RequestValidationException;
 import org.apache.cassandra.exceptions.UnauthorizedException;
+import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.IndexMetadata;
 import org.apache.cassandra.schema.Indexes;
+import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.Event;
 
@@ -75,20 +74,20 @@ public class CreateIndexStatement extends 
SchemaAlteringStatement
 
     public void validate(ClientState state) throws RequestValidationException
     {
-        CFMetaData cfm = Validation.validateColumnFamily(keyspace(), 
columnFamily());
+        TableMetadata table = Schema.instance.validateTable(keyspace(), 
columnFamily());
 
-        if (cfm.isCounter())
+        if (table.isCounter())
             throw new InvalidRequestException("Secondary indexes are not 
supported on counter tables");
 
-        if (cfm.isView())
+        if (table.isView())
             throw new InvalidRequestException("Secondary indexes are not 
supported on materialized views");
 
-        if (cfm.isCompactTable() && !cfm.isStaticCompactTable())
+        if (table.isCompactTable() && !table.isStaticCompactTable())
             throw new InvalidRequestException("Secondary indexes are not 
supported on COMPACT STORAGE tables that have clustering columns");
 
         List<IndexTarget> targets = new ArrayList<>(rawTargets.size());
         for (IndexTarget.Raw rawTarget : rawTargets)
-            targets.add(rawTarget.prepare(cfm));
+            targets.add(rawTarget.prepare(table));
 
         if (targets.isEmpty() && !properties.isCustom)
             throw new InvalidRequestException("Only CUSTOM indexes can be 
created without specifying a target column");
@@ -98,16 +97,16 @@ public class CreateIndexStatement extends 
SchemaAlteringStatement
 
         for (IndexTarget target : targets)
         {
-            ColumnDefinition cd = cfm.getColumnDefinition(target.column);
+            ColumnMetadata cd = table.getColumn(target.column);
 
             if (cd == null)
                 throw new InvalidRequestException("No column definition found 
for column " + target.column);
 
             // TODO: we could lift that limitation
-            if (cfm.isCompactTable() && cd.isPrimaryKeyColumn())
+            if (table.isCompactTable() && cd.isPrimaryKeyColumn())
                 throw new InvalidRequestException("Secondary indexes are not 
supported on PRIMARY KEY columns in COMPACT STORAGE tables");
 
-            if (cd.kind == ColumnDefinition.Kind.PARTITION_KEY && 
cfm.getKeyValidatorAsClusteringComparator().size() == 1)
+            if (cd.kind == ColumnMetadata.Kind.PARTITION_KEY && 
table.partitionKeyColumns().size() == 1)
                 throw new InvalidRequestException(String.format("Cannot create 
secondary index on partition key column %s", target.column));
 
             boolean isMap = cd.type instanceof MapType;
@@ -126,7 +125,7 @@ public class CreateIndexStatement extends 
SchemaAlteringStatement
 
         if (!Strings.isNullOrEmpty(indexName))
         {
-            if 
(Schema.instance.getKSMetaData(keyspace()).existingIndexNames(null).contains(indexName))
+            if 
(Schema.instance.getKeyspaceMetadata(keyspace()).existingIndexNames(null).contains(indexName))
             {
                 if (ifNotExists)
                     return;
@@ -152,7 +151,7 @@ public class CreateIndexStatement extends 
SchemaAlteringStatement
             throw new InvalidRequestException("full() indexes can only be 
created on frozen collections");
     }
 
-    private void 
validateIsSimpleIndexIfTargetColumnNotCollection(ColumnDefinition cd, 
IndexTarget target) throws InvalidRequestException
+    private void 
validateIsSimpleIndexIfTargetColumnNotCollection(ColumnMetadata cd, IndexTarget 
target) throws InvalidRequestException
     {
         if (!cd.type.isCollection() && target.type != IndexTarget.Type.SIMPLE)
             throw new InvalidRequestException(String.format("Cannot create 
%s() index on %s. " +
@@ -183,10 +182,10 @@ public class CreateIndexStatement extends 
SchemaAlteringStatement
 
     public Event.SchemaChange announceMigration(QueryState queryState, boolean 
isLocalOnly) throws RequestValidationException
     {
-        CFMetaData cfm = Schema.instance.getCFMetaData(keyspace(), 
columnFamily()).copy();
+        TableMetadata current = Schema.instance.getTableMetadata(keyspace(), 
columnFamily());
         List<IndexTarget> targets = new ArrayList<>(rawTargets.size());
         for (IndexTarget.Raw rawTarget : rawTargets)
-            targets.add(rawTarget.prepare(cfm));
+            targets.add(rawTarget.prepare(current));
 
         String acceptedName = indexName;
         if (Strings.isNullOrEmpty(acceptedName))
@@ -196,7 +195,7 @@ public class CreateIndexStatement extends 
SchemaAlteringStatement
                                                          targets.size() == 1 ? 
targets.get(0).column.toString() : null);
         }
 
-        if 
(Schema.instance.getKSMetaData(keyspace()).existingIndexNames(null).contains(acceptedName))
+        if 
(Schema.instance.getKeyspaceMetadata(keyspace()).existingIndexNames(null).contains(acceptedName))
         {
             if (ifNotExists)
                 return null;
@@ -214,13 +213,13 @@ public class CreateIndexStatement extends 
SchemaAlteringStatement
         else
         {
             indexOptions = Collections.emptyMap();
-            kind = cfm.isCompound() ? IndexMetadata.Kind.COMPOSITES : 
IndexMetadata.Kind.KEYS;
+            kind = current.isCompound() ? IndexMetadata.Kind.COMPOSITES : 
IndexMetadata.Kind.KEYS;
         }
 
-        IndexMetadata index = IndexMetadata.fromIndexTargets(cfm, targets, 
acceptedName, kind, indexOptions);
+        IndexMetadata index = IndexMetadata.fromIndexTargets(targets, 
acceptedName, kind, indexOptions);
 
         // check to disallow creation of an index which duplicates an existing 
one in all but name
-        Optional<IndexMetadata> existingIndex = 
Iterables.tryFind(cfm.getIndexes(), existing -> 
existing.equalsWithoutName(index));
+        Optional<IndexMetadata> existingIndex = 
Iterables.tryFind(current.indexes, existing -> 
existing.equalsWithoutName(index));
         if (existingIndex.isPresent())
         {
             if (ifNotExists)
@@ -231,10 +230,14 @@ public class CreateIndexStatement extends 
SchemaAlteringStatement
                                                                 
existingIndex.get().name));
         }
 
+        TableMetadata updated =
+            current.unbuild()
+                   .indexes(current.indexes.with(index))
+                   .build();
+
         logger.trace("Updating index definition for {}", indexName);
-        cfm.indexes(cfm.getIndexes().with(index));
 
-        MigrationManager.announceColumnFamilyUpdate(cfm, isLocalOnly);
+        MigrationManager.announceTableUpdate(updated, isLocalOnly);
 
         // Creating an index is akin to updating the CF
         return new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, 
Event.SchemaChange.Target.TABLE, keyspace(), columnFamily());

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/CreateKeyspaceStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/CreateKeyspaceStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/CreateKeyspaceStatement.java
index b1e63fb..f859ff7 100644
--- a/src/java/org/apache/cassandra/cql3/statements/CreateKeyspaceStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/CreateKeyspaceStatement.java
@@ -20,13 +20,14 @@ package org.apache.cassandra.cql3.statements;
 import java.util.regex.Pattern;
 
 import org.apache.cassandra.auth.*;
-import org.apache.cassandra.cql3.Validation;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.config.SchemaConstants;
 import org.apache.cassandra.exceptions.*;
 import org.apache.cassandra.locator.LocalStrategy;
 import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.KeyspaceParams;
+import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.service.*;
 import org.apache.cassandra.transport.Event;
 
@@ -74,7 +75,7 @@ public class CreateKeyspaceStatement extends 
SchemaAlteringStatement
      */
     public void validate(ClientState state) throws RequestValidationException
     {
-        Validation.validateKeyspaceNotSystem(name);
+        Schema.validateKeyspaceNotSystem(name);
 
         // keyspace name
         if (!PATTERN_WORD_CHARS.matcher(name).matches())

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java
index aabd221..1b09c0b 100644
--- a/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java
@@ -30,11 +30,8 @@ import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.exceptions.*;
-import org.apache.cassandra.schema.KeyspaceMetadata;
-import org.apache.cassandra.schema.TableParams;
-import org.apache.cassandra.schema.Types;
+import org.apache.cassandra.schema.*;
 import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.Event;
 
@@ -61,9 +58,9 @@ public class CreateTableStatement extends 
SchemaAlteringStatement
     private final Set<ColumnIdentifier> staticColumns;
     private final TableParams params;
     private final boolean ifNotExists;
-    private final UUID id;
+    private final TableId id;
 
-    public CreateTableStatement(CFName name, TableParams params, boolean 
ifNotExists, Set<ColumnIdentifier> staticColumns, UUID id)
+    public CreateTableStatement(CFName name, TableParams params, boolean 
ifNotExists, Set<ColumnIdentifier> staticColumns, TableId id)
     {
         super(name);
         this.params = params;
@@ -86,7 +83,7 @@ public class CreateTableStatement extends 
SchemaAlteringStatement
     {
         try
         {
-            MigrationManager.announceNewColumnFamily(getCFMetaData(), 
isLocalOnly);
+            MigrationManager.announceNewTable(toTableMetadata(), isLocalOnly);
             return new Event.SchemaChange(Event.SchemaChange.Change.CREATED, 
Event.SchemaChange.Target.TABLE, keyspace(), columnFamily());
         }
         catch (AlreadyExistsException e)
@@ -113,12 +110,33 @@ public class CreateTableStatement extends 
SchemaAlteringStatement
         }
     }
 
-    public CFMetaData.Builder metadataBuilder()
+    /**
+     */
+    public static TableMetadata.Builder parse(String cql, String keyspace)
+    {
+        CreateTableStatement.RawStatement raw = 
CQLFragmentParser.parseAny(CqlParser::createTableStatement, cql, "CREATE 
TABLE");
+        raw.prepareKeyspace(keyspace);
+        CreateTableStatement prepared = (CreateTableStatement) 
raw.prepare(Types.none()).statement;
+        return prepared.builder();
+    }
+
+    public TableMetadata.Builder builder()
     {
-        CFMetaData.Builder builder = CFMetaData.Builder.create(keyspace(), 
columnFamily(), isDense, isCompound, hasCounters);
-        builder.withId(id);
+        TableMetadata.Builder builder = TableMetadata.builder(keyspace(), 
columnFamily());
+
+        if (id != null)
+            builder.id(id);
+
+        builder.isDense(isDense)
+               .isCompound(isCompound)
+               .isCounter(hasCounters)
+               .isSuper(false)
+               .isView(false)
+               .params(params);
+
         for (int i = 0; i < keyAliases.size(); i++)
-            builder.addPartitionKey(keyAliases.get(i), keyTypes.get(i));
+            builder.addPartitionKeyColumn(keyAliases.get(i), keyTypes.get(i));
+
         for (int i = 0; i < columnAliases.size(); i++)
             builder.addClusteringColumn(columnAliases.get(i), 
clusteringTypes.get(i));
 
@@ -136,14 +154,14 @@ public class CreateTableStatement extends 
SchemaAlteringStatement
         boolean isCompactTable = isDense || !isCompound;
         if (isCompactTable)
         {
-            CompactTables.DefaultNames names = 
CompactTables.defaultNameGenerator(builder.usedColumnNames());
+            CompactTables.DefaultNames names = 
CompactTables.defaultNameGenerator(builder.columnNames());
             // Compact tables always have a clustering and a single regular 
value.
             if (isStaticCompact)
             {
                 builder.addClusteringColumn(names.defaultClusteringName(), 
UTF8Type.instance);
                 builder.addRegularColumn(names.defaultCompactValueName(), 
hasCounters ? CounterColumnType.instance : BytesType.instance);
             }
-            else if (isDense && !builder.hasRegulars())
+            else if (isDense && !builder.hasRegularColumns())
             {
                 // Even for dense, we might not have our regular column if it 
wasn't part of the declaration. If
                 // that's the case, add it but with a specific EmptyType so we 
can recognize that case later
@@ -155,20 +173,14 @@ public class CreateTableStatement extends 
SchemaAlteringStatement
     }
 
     /**
-     * Returns a CFMetaData instance based on the parameters parsed from this
+     * Returns a TableMetadata instance based on the parameters parsed from 
this
      * {@code CREATE} statement, or defaults where applicable.
      *
-     * @return a CFMetaData instance corresponding to the values parsed from 
this statement
-     * @throws InvalidRequestException on failure to validate parsed parameters
+     * @return a TableMetadata instance corresponding to the values parsed 
from this statement
      */
-    public CFMetaData getCFMetaData()
-    {
-        return metadataBuilder().build().params(params);
-    }
-
-    public TableParams params()
+    public TableMetadata toTableMetadata()
     {
-        return params;
+        return builder().build();
     }
 
     public static class RawStatement extends CFStatement
@@ -195,7 +207,7 @@ public class CreateTableStatement extends 
SchemaAlteringStatement
          */
         public ParsedStatement.Prepared prepare() throws 
RequestValidationException
         {
-            KeyspaceMetadata ksm = Schema.instance.getKSMetaData(keyspace());
+            KeyspaceMetadata ksm = 
Schema.instance.getKeyspaceMetadata(keyspace());
             if (ksm == null)
                 throw new ConfigurationException(String.format("Keyspace %s 
doesn't exist", keyspace()));
             return prepare(ksm.types);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/CreateTriggerStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/CreateTriggerStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/CreateTriggerStatement.java
index 8f84e4a..0f12b9c 100644
--- a/src/java/org/apache/cassandra/cql3/statements/CreateTriggerStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/CreateTriggerStatement.java
@@ -20,18 +20,17 @@ package org.apache.cassandra.cql3.statements;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.Schema;
 import org.apache.cassandra.cql3.CFName;
-import org.apache.cassandra.cql3.Validation;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.exceptions.RequestValidationException;
 import org.apache.cassandra.exceptions.UnauthorizedException;
+import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.TriggerMetadata;
 import org.apache.cassandra.schema.Triggers;
 import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.Event;
 import org.apache.cassandra.triggers.TriggerExecutor;
@@ -59,8 +58,8 @@ public class CreateTriggerStatement extends 
SchemaAlteringStatement
 
     public void validate(ClientState state) throws RequestValidationException
     {
-        CFMetaData cfm = Validation.validateColumnFamily(keyspace(), 
columnFamily());
-        if (cfm.isView())
+        TableMetadata metadata = Schema.instance.validateTable(keyspace(), 
columnFamily());
+        if (metadata.isView())
             throw new InvalidRequestException("Cannot CREATE TRIGGER against a 
materialized view");
 
         try
@@ -75,8 +74,8 @@ public class CreateTriggerStatement extends 
SchemaAlteringStatement
 
     public Event.SchemaChange announceMigration(QueryState queryState, boolean 
isLocalOnly) throws ConfigurationException, InvalidRequestException
     {
-        CFMetaData cfm = Schema.instance.getCFMetaData(keyspace(), 
columnFamily()).copy();
-        Triggers triggers = cfm.getTriggers();
+        TableMetadata current = Schema.instance.getTableMetadata(keyspace(), 
columnFamily());
+        Triggers triggers = current.triggers;
 
         if (triggers.get(triggerName).isPresent())
         {
@@ -86,9 +85,14 @@ public class CreateTriggerStatement extends 
SchemaAlteringStatement
                 throw new InvalidRequestException(String.format("Trigger %s 
already exists", triggerName));
         }
 
-        cfm.triggers(triggers.with(TriggerMetadata.create(triggerName, 
triggerClass)));
+        TableMetadata updated =
+            current.unbuild()
+                   .triggers(triggers.with(TriggerMetadata.create(triggerName, 
triggerClass)))
+                   .build();
+
         logger.info("Adding trigger with name {} and class {}", triggerName, 
triggerClass);
-        MigrationManager.announceColumnFamilyUpdate(cfm, isLocalOnly);
+
+        MigrationManager.announceTableUpdate(updated, isLocalOnly);
         return new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, 
Event.SchemaChange.Target.TABLE, keyspace(), columnFamily());
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/CreateTypeStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/CreateTypeStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/CreateTypeStatement.java
index ff9af75..4462bc2 100644
--- a/src/java/org/apache/cassandra/cql3/statements/CreateTypeStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/CreateTypeStatement.java
@@ -21,15 +21,15 @@ import java.util.*;
 import java.util.stream.Collectors;
 
 import org.apache.cassandra.auth.Permission;
-import org.apache.cassandra.config.*;
 import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.UserType;
 import org.apache.cassandra.exceptions.*;
 import org.apache.cassandra.schema.KeyspaceMetadata;
+import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.Types;
 import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.Event;
 
@@ -67,7 +67,7 @@ public class CreateTypeStatement extends 
SchemaAlteringStatement
 
     public void validate(ClientState state) throws RequestValidationException
     {
-        KeyspaceMetadata ksm = 
Schema.instance.getKSMetaData(name.getKeyspace());
+        KeyspaceMetadata ksm = 
Schema.instance.getKeyspaceMetadata(name.getKeyspace());
         if (ksm == null)
             throw new InvalidRequestException(String.format("Cannot add type 
in unknown keyspace %s", name.getKeyspace()));
 
@@ -120,7 +120,7 @@ public class CreateTypeStatement extends 
SchemaAlteringStatement
 
     public Event.SchemaChange announceMigration(QueryState queryState, boolean 
isLocalOnly) throws InvalidRequestException, ConfigurationException
     {
-        KeyspaceMetadata ksm = 
Schema.instance.getKSMetaData(name.getKeyspace());
+        KeyspaceMetadata ksm = 
Schema.instance.getKeyspaceMetadata(name.getKeyspace());
         assert ksm != null; // should haven't validate otherwise
 
         // Can happen with ifNotExists

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java
index cf5be1e..8e92534 100644
--- a/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java
@@ -24,10 +24,6 @@ import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
 
 import org.apache.cassandra.auth.Permission;
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.ColumnDefinition;
-import org.apache.cassandra.config.Schema;
-import org.apache.cassandra.config.ViewDefinition;
 import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.cql3.restrictions.StatementRestrictions;
 import org.apache.cassandra.cql3.selection.RawSelector;
@@ -40,9 +36,13 @@ import 
org.apache.cassandra.exceptions.AlreadyExistsException;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.exceptions.RequestValidationException;
 import org.apache.cassandra.exceptions.UnauthorizedException;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.TableParams;
+import org.apache.cassandra.schema.ViewMetadata;
 import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.Event;
 
@@ -51,8 +51,8 @@ public class CreateViewStatement extends 
SchemaAlteringStatement
     private final CFName baseName;
     private final List<RawSelector> selectClause;
     private final WhereClause whereClause;
-    private final List<ColumnDefinition.Raw> partitionKeys;
-    private final List<ColumnDefinition.Raw> clusteringKeys;
+    private final List<ColumnMetadata.Raw> partitionKeys;
+    private final List<ColumnMetadata.Raw> clusteringKeys;
     public final CFProperties properties = new CFProperties();
     private final boolean ifNotExists;
 
@@ -60,8 +60,8 @@ public class CreateViewStatement extends 
SchemaAlteringStatement
                                CFName baseName,
                                List<RawSelector> selectClause,
                                WhereClause whereClause,
-                               List<ColumnDefinition.Raw> partitionKeys,
-                               List<ColumnDefinition.Raw> clusteringKeys,
+                               List<ColumnMetadata.Raw> partitionKeys,
+                               List<ColumnMetadata.Raw> clusteringKeys,
                                boolean ifNotExists)
     {
         super(viewName);
@@ -91,11 +91,11 @@ public class CreateViewStatement extends 
SchemaAlteringStatement
         void add(ColumnIdentifier identifier, AbstractType<?> type);
     }
 
-    private void add(CFMetaData baseCfm, Iterable<ColumnIdentifier> columns, 
AddColumn adder)
+    private void add(TableMetadata baseCfm, Iterable<ColumnIdentifier> 
columns, AddColumn adder)
     {
         for (ColumnIdentifier column : columns)
         {
-            AbstractType<?> type = baseCfm.getColumnDefinition(column).type;
+            AbstractType<?> type = baseCfm.getColumn(column).type;
             if (properties.definedOrdering.containsKey(column))
             {
                 boolean desc = properties.definedOrdering.get(column);
@@ -133,14 +133,14 @@ public class CreateViewStatement extends 
SchemaAlteringStatement
         if (!baseName.getKeyspace().equals(keyspace()))
             throw new InvalidRequestException("Cannot create a materialized 
view on a table in a separate keyspace");
 
-        CFMetaData cfm = 
Validation.validateColumnFamily(baseName.getKeyspace(), 
baseName.getColumnFamily());
+        TableMetadata metadata = 
Schema.instance.validateTable(baseName.getKeyspace(), 
baseName.getColumnFamily());
 
-        if (cfm.isCounter())
+        if (metadata.isCounter())
             throw new InvalidRequestException("Materialized views are not 
supported on counter tables");
-        if (cfm.isView())
+        if (metadata.isView())
             throw new InvalidRequestException("Materialized views cannot be 
created against other materialized views");
 
-        if (cfm.params.gcGraceSeconds == 0)
+        if (metadata.params.gcGraceSeconds == 0)
         {
             throw new InvalidRequestException(String.format("Cannot create 
materialized view '%s' for base table " +
                                                             "'%s' with 
gc_grace_seconds of 0, since this value is " +
@@ -163,21 +163,21 @@ public class CreateViewStatement extends 
SchemaAlteringStatement
             if (selector.alias != null)
                 throw new InvalidRequestException("Cannot use alias when 
defining a materialized view");
 
-            Selectable s = selectable.prepare(cfm);
+            Selectable s = selectable.prepare(metadata);
             if (s instanceof Term.Raw)
                 throw new InvalidRequestException("Cannot use terms in 
selection when defining a materialized view");
 
-            ColumnDefinition cdef = (ColumnDefinition)s;
+            ColumnMetadata cdef = (ColumnMetadata)s;
             included.add(cdef.name);
         }
 
-        Set<ColumnDefinition.Raw> targetPrimaryKeys = new HashSet<>();
-        for (ColumnDefinition.Raw identifier : Iterables.concat(partitionKeys, 
clusteringKeys))
+        Set<ColumnMetadata.Raw> targetPrimaryKeys = new HashSet<>();
+        for (ColumnMetadata.Raw identifier : Iterables.concat(partitionKeys, 
clusteringKeys))
         {
             if (!targetPrimaryKeys.add(identifier))
                 throw new InvalidRequestException("Duplicate entry found in 
PRIMARY KEY: "+identifier);
 
-            ColumnDefinition cdef = identifier.prepare(cfm);
+            ColumnMetadata cdef = identifier.prepare(metadata);
 
             if (cdef.type.isMultiCell())
                 throw new InvalidRequestException(String.format("Cannot use 
MultiCell column '%s' in PRIMARY KEY of materialized view", identifier));
@@ -190,8 +190,8 @@ public class CreateViewStatement extends 
SchemaAlteringStatement
         }
 
         // build the select statement
-        Map<ColumnDefinition.Raw, Boolean> orderings = Collections.emptyMap();
-        List<ColumnDefinition.Raw> groups = Collections.emptyList();
+        Map<ColumnMetadata.Raw, Boolean> orderings = Collections.emptyMap();
+        List<ColumnMetadata.Raw> groups = Collections.emptyList();
         SelectStatement.Parameters parameters = new 
SelectStatement.Parameters(orderings, groups, false, true, false);
 
         SelectStatement.RawStatement rawSelect = new 
SelectStatement.RawStatement(baseName, parameters, selectClause, whereClause, 
null, null);
@@ -212,7 +212,7 @@ public class CreateViewStatement extends 
SchemaAlteringStatement
         String whereClauseText = 
View.relationsToWhereClause(whereClause.relations);
 
         Set<ColumnIdentifier> basePrimaryKeyCols = new HashSet<>();
-        for (ColumnDefinition definition : 
Iterables.concat(cfm.partitionKeyColumns(), cfm.clusteringColumns()))
+        for (ColumnMetadata definition : 
Iterables.concat(metadata.partitionKeyColumns(), metadata.clusteringColumns()))
             basePrimaryKeyCols.add(definition.name);
 
         List<ColumnIdentifier> targetClusteringColumns = new ArrayList<>();
@@ -220,11 +220,11 @@ public class CreateViewStatement extends 
SchemaAlteringStatement
 
         // This is only used as an intermediate state; this is to catch 
whether multiple non-PK columns are used
         boolean hasNonPKColumn = false;
-        for (ColumnDefinition.Raw raw : partitionKeys)
-            hasNonPKColumn |= getColumnIdentifier(cfm, basePrimaryKeyCols, 
hasNonPKColumn, raw, targetPartitionKeys, restrictions);
+        for (ColumnMetadata.Raw raw : partitionKeys)
+            hasNonPKColumn |= getColumnIdentifier(metadata, 
basePrimaryKeyCols, hasNonPKColumn, raw, targetPartitionKeys, restrictions);
 
-        for (ColumnDefinition.Raw raw : clusteringKeys)
-            hasNonPKColumn |= getColumnIdentifier(cfm, basePrimaryKeyCols, 
hasNonPKColumn, raw, targetClusteringColumns, restrictions);
+        for (ColumnMetadata.Raw raw : clusteringKeys)
+            hasNonPKColumn |= getColumnIdentifier(metadata, 
basePrimaryKeyCols, hasNonPKColumn, raw, targetClusteringColumns, restrictions);
 
         // We need to include all of the primary key columns from the base 
table in order to make sure that we do not
         // overwrite values in the view. We cannot support "collapsing" the 
base table into a smaller number of rows in
@@ -234,7 +234,7 @@ public class CreateViewStatement extends 
SchemaAlteringStatement
         boolean missingClusteringColumns = false;
         StringBuilder columnNames = new StringBuilder();
         List<ColumnIdentifier> includedColumns = new ArrayList<>();
-        for (ColumnDefinition def : cfm.allColumns())
+        for (ColumnMetadata def : metadata.columns())
         {
             ColumnIdentifier identifier = def.name;
             boolean includeDef = included.isEmpty() || 
included.contains(identifier);
@@ -281,21 +281,23 @@ public class CreateViewStatement extends 
SchemaAlteringStatement
                                               "the corresponding data in the 
parent table.");
         }
 
-        CFMetaData.Builder cfmBuilder = 
CFMetaData.Builder.createView(keyspace(), columnFamily());
-        add(cfm, targetPartitionKeys, cfmBuilder::addPartitionKey);
-        add(cfm, targetClusteringColumns, cfmBuilder::addClusteringColumn);
-        add(cfm, includedColumns, cfmBuilder::addRegularColumn);
-        cfmBuilder.withId(properties.properties.getId());
-
-        CFMetaData viewCfm = cfmBuilder.build().params(params);
-        ViewDefinition definition = new ViewDefinition(keyspace(),
-                                                       columnFamily(),
-                                                       
Schema.instance.getId(keyspace(), baseName.getColumnFamily()),
-                                                       
baseName.getColumnFamily(),
-                                                       included.isEmpty(),
-                                                       rawSelect,
-                                                       whereClauseText,
-                                                       viewCfm);
+        TableMetadata.Builder builder =
+            TableMetadata.builder(keyspace(), columnFamily(), 
properties.properties.getId())
+                         .isView(true)
+                         .params(params);
+
+        add(metadata, targetPartitionKeys, builder::addPartitionKeyColumn);
+        add(metadata, targetClusteringColumns, builder::addClusteringColumn);
+        add(metadata, includedColumns, builder::addRegularColumn);
+
+        ViewMetadata definition = new ViewMetadata(keyspace(),
+                                                   columnFamily(),
+                                                   metadata.id,
+                                                   metadata.name,
+                                                   included.isEmpty(),
+                                                   rawSelect,
+                                                   whereClauseText,
+                                                   builder.build());
 
         try
         {
@@ -310,14 +312,14 @@ public class CreateViewStatement extends 
SchemaAlteringStatement
         }
     }
 
-    private static boolean getColumnIdentifier(CFMetaData cfm,
+    private static boolean getColumnIdentifier(TableMetadata cfm,
                                                Set<ColumnIdentifier> basePK,
                                                boolean hasNonPKColumn,
-                                               ColumnDefinition.Raw raw,
+                                               ColumnMetadata.Raw raw,
                                                List<ColumnIdentifier> columns,
                                                StatementRestrictions 
restrictions)
     {
-        ColumnDefinition def = raw.prepare(cfm);
+        ColumnMetadata def = raw.prepare(cfm);
 
         boolean isPk = basePK.contains(def.name);
         if (!isPk && hasNonPKColumn)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java
index 10f3d6f..e880bf8 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java
@@ -19,8 +19,6 @@ package org.apache.cassandra.cql3.statements;
 
 import java.util.List;
 
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.ColumnDefinition;
 import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.cql3.conditions.ColumnCondition;
 import org.apache.cassandra.cql3.conditions.Conditions;
@@ -29,6 +27,8 @@ import org.apache.cassandra.db.Clustering;
 import org.apache.cassandra.db.Slice;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.utils.Pair;
 
 import static 
org.apache.cassandra.cql3.statements.RequestValidations.checkFalse;
@@ -40,7 +40,7 @@ import static 
org.apache.cassandra.cql3.statements.RequestValidations.checkTrue;
 public class DeleteStatement extends ModificationStatement
 {
     private DeleteStatement(int boundTerms,
-                            CFMetaData cfm,
+                            TableMetadata cfm,
                             Operations operations,
                             StatementRestrictions restrictions,
                             Conditions conditions,
@@ -53,6 +53,8 @@ public class DeleteStatement extends ModificationStatement
     public void addUpdateForKey(PartitionUpdate update, Clustering clustering, 
UpdateParameters params)
     throws InvalidRequestException
     {
+        TableMetadata metadata = metadata();
+
         List<Operation> regularDeletions = getRegularOperations();
         List<Operation> staticDeletions = getStaticOperations();
 
@@ -64,7 +66,7 @@ public class DeleteStatement extends ModificationStatement
                 update.addPartitionDeletion(params.deletionTime());
             }
             // ... or a row deletion ...
-            else if (clustering.size() == cfm.clusteringColumns().size())
+            else if (clustering.size() == metadata.clusteringColumns().size())
             {
                 params.newRow(clustering);
                 params.addRowDeletion();
@@ -73,7 +75,7 @@ public class DeleteStatement extends ModificationStatement
             // ... or a range of rows deletion.
             else
             {
-                update.add(params.makeRangeTombstone(cfm.comparator, 
clustering));
+                update.add(params.makeRangeTombstone(metadata.comparator, 
clustering));
             }
         }
         else
@@ -83,7 +85,7 @@ public class DeleteStatement extends ModificationStatement
                 // if the clustering size is zero but there are some 
clustering columns, it means that it's a
                 // range deletion (the full partition) in which case we need 
to throw an error as range deletion
                 // do not support specific columns
-                checkFalse(clustering.size() == 0 && 
cfm.clusteringColumns().size() != 0,
+                checkFalse(clustering.size() == 0 && 
metadata.clusteringColumns().size() != 0,
                            "Range deletions are not supported for specific 
columns");
 
                 params.newRow(clustering);
@@ -124,7 +126,7 @@ public class DeleteStatement extends ModificationStatement
                       Attributes.Raw attrs,
                       List<Operation.RawDeletion> deletions,
                       WhereClause whereClause,
-                      List<Pair<ColumnDefinition.Raw, ColumnCondition.Raw>> 
conditions,
+                      List<Pair<ColumnMetadata.Raw, ColumnCondition.Raw>> 
conditions,
                       boolean ifExists)
         {
             super(name, StatementType.DELETE, attrs, conditions, false, 
ifExists);
@@ -134,7 +136,7 @@ public class DeleteStatement extends ModificationStatement
 
 
         @Override
-        protected ModificationStatement prepareInternal(CFMetaData cfm,
+        protected ModificationStatement prepareInternal(TableMetadata metadata,
                                                         VariableSpecifications 
boundNames,
                                                         Conditions conditions,
                                                         Attributes attrs)
@@ -143,25 +145,25 @@ public class DeleteStatement extends ModificationStatement
 
             for (Operation.RawDeletion deletion : deletions)
             {
-                ColumnDefinition def = getColumnDefinition(cfm, 
deletion.affectedColumn());
+                ColumnMetadata def = getColumnDefinition(metadata, 
deletion.affectedColumn());
 
                 // For compact, we only have one value except the key, so the 
only form of DELETE that make sense is without a column
                 // list. However, we support having the value name for 
coherence with the static/sparse case
                 checkFalse(def.isPrimaryKeyColumn(), "Invalid identifier %s 
for deletion (should not be a PRIMARY KEY part)", def.name);
 
-                Operation op = deletion.prepare(cfm.ksName, def, cfm);
+                Operation op = deletion.prepare(metadata.keyspace, def, 
metadata);
                 op.collectMarkerSpecification(boundNames);
                 operations.add(op);
             }
 
-            StatementRestrictions restrictions = newRestrictions(cfm,
+            StatementRestrictions restrictions = newRestrictions(metadata,
                                                                  boundNames,
                                                                  operations,
                                                                  whereClause,
                                                                  conditions);
 
             DeleteStatement stmt = new DeleteStatement(boundNames.size(),
-                                                       cfm,
+                                                       metadata,
                                                        operations,
                                                        restrictions,
                                                        conditions,

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java
index 6f41af5..1a02903 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java
@@ -22,16 +22,15 @@ import java.util.Collection;
 import java.util.List;
 
 import org.apache.cassandra.auth.Permission;
-import org.apache.cassandra.config.Schema;
 import org.apache.cassandra.cql3.CQL3Type;
-import org.apache.cassandra.cql3.Validation;
 import org.apache.cassandra.cql3.functions.*;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.exceptions.RequestValidationException;
 import org.apache.cassandra.exceptions.UnauthorizedException;
+import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.Event;
 
@@ -64,7 +63,7 @@ public final class DropAggregateStatement extends 
SchemaAlteringStatement
         if (!functionName.hasKeyspace())
             throw new InvalidRequestException("Functions must be fully 
qualified with a keyspace name if a keyspace is not set for the session");
 
-        Validation.validateKeyspaceNotSystem(functionName.keyspace);
+        Schema.validateKeyspaceNotSystem(functionName.keyspace);
     }
 
     public void checkAccess(ClientState state) throws UnauthorizedException, 
InvalidRequestException
@@ -92,7 +91,7 @@ public final class DropAggregateStatement extends 
SchemaAlteringStatement
         Function old = null;
         if (argsPresent)
         {
-            if (Schema.instance.getKSMetaData(functionName.keyspace) != null)
+            if (Schema.instance.getKeyspaceMetadata(functionName.keyspace) != 
null)
             {
                 List<AbstractType<?>> argTypes = new 
ArrayList<>(argRawTypes.size());
                 for (CQL3Type.Raw rawType : argRawTypes)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java
index e098d0a..87bfff8 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java
@@ -25,17 +25,16 @@ import com.google.common.base.Joiner;
 
 import org.apache.cassandra.auth.FunctionResource;
 import org.apache.cassandra.auth.Permission;
-import org.apache.cassandra.config.Schema;
 import org.apache.cassandra.cql3.CQL3Type;
-import org.apache.cassandra.cql3.Validation;
 import org.apache.cassandra.cql3.functions.*;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.exceptions.RequestValidationException;
 import org.apache.cassandra.exceptions.UnauthorizedException;
 import org.apache.cassandra.schema.KeyspaceMetadata;
+import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.Event;
 
@@ -65,7 +64,7 @@ public final class DropFunctionStatement extends 
SchemaAlteringStatement
     @Override
     public Prepared prepare() throws InvalidRequestException
     {
-        if (Schema.instance.getKSMetaData(functionName.keyspace) != null)
+        if (Schema.instance.getKeyspaceMetadata(functionName.keyspace) != null)
         {
             argTypes = new ArrayList<>(argRawTypes.size());
             for (CQL3Type.Raw rawType : argRawTypes)
@@ -94,7 +93,7 @@ public final class DropFunctionStatement extends 
SchemaAlteringStatement
         if (!functionName.hasKeyspace())
             throw new InvalidRequestException("Functions must be fully 
qualified with a keyspace name if a keyspace is not set for the session");
 
-        Validation.validateKeyspaceNotSystem(functionName.keyspace);
+        Schema.validateKeyspaceNotSystem(functionName.keyspace);
     }
 
     public void checkAccess(ClientState state) throws UnauthorizedException, 
InvalidRequestException
@@ -139,7 +138,7 @@ public final class DropFunctionStatement extends 
SchemaAlteringStatement
                 throw new InvalidRequestException(getMissingFunctionError());
         }
 
-        KeyspaceMetadata ksm = 
Schema.instance.getKSMetaData(old.name().keyspace);
+        KeyspaceMetadata ksm = 
Schema.instance.getKeyspaceMetadata(old.name().keyspace);
         Collection<UDAggregate> referrers = 
ksm.functions.aggregatesUsingFunction(old);
         if (!referrers.isEmpty())
             throw new InvalidRequestException(String.format("Function '%s' 
still referenced by %s", old, referrers));

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java
index fcd06d4..2420f3b 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java
@@ -18,15 +18,15 @@
 package org.apache.cassandra.cql3.statements;
 
 import org.apache.cassandra.auth.Permission;
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.Schema;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.cql3.IndexName;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.db.KeyspaceNotDefinedException;
 import org.apache.cassandra.exceptions.*;
 import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.MigrationManager;
+import org.apache.cassandra.schema.MigrationManager;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.Event;
 import org.apache.cassandra.transport.messages.ResultMessage;
@@ -45,17 +45,17 @@ public class DropIndexStatement extends 
SchemaAlteringStatement
 
     public String columnFamily()
     {
-        CFMetaData cfm = lookupIndexedTable();
-        return cfm == null ? null : cfm.cfName;
+        TableMetadata metadata = lookupIndexedTable();
+        return metadata == null ? null : metadata.name;
     }
 
     public void checkAccess(ClientState state) throws UnauthorizedException, 
InvalidRequestException
     {
-        CFMetaData cfm = lookupIndexedTable();
-        if (cfm == null)
+        TableMetadata metadata = lookupIndexedTable();
+        if (metadata == null)
             return;
 
-        state.hasColumnFamilyAccess(cfm.ksName, cfm.cfName, Permission.ALTER);
+        state.hasColumnFamilyAccess(metadata.keyspace, metadata.name, 
Permission.ALTER);
     }
 
     public void validate(ClientState state)
@@ -72,17 +72,20 @@ public class DropIndexStatement extends 
SchemaAlteringStatement
 
     public Event.SchemaChange announceMigration(QueryState queryState, boolean 
isLocalOnly) throws InvalidRequestException, ConfigurationException
     {
-        CFMetaData cfm = lookupIndexedTable();
-        if (cfm == null)
+        TableMetadata current = lookupIndexedTable();
+        if (current == null)
             return null;
 
-        CFMetaData updatedCfm = cfm.copy();
-        updatedCfm.indexes(updatedCfm.getIndexes().without(indexName));
-        MigrationManager.announceColumnFamilyUpdate(updatedCfm, isLocalOnly);
+        TableMetadata updated =
+            current.unbuild()
+                   .indexes(current.indexes.without(indexName))
+                   .build();
+
+        MigrationManager.announceTableUpdate(updated, isLocalOnly);
         // Dropping an index is akin to updating the CF
         // Note that we shouldn't call columnFamily() at this point because 
the index has been dropped and the call to lookupIndexedTable()
         // in that method would now throw.
-        return new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, 
Event.SchemaChange.Target.TABLE, cfm.ksName, cfm.cfName);
+        return new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, 
Event.SchemaChange.Target.TABLE, current.keyspace, current.name);
     }
 
     /**
@@ -94,9 +97,9 @@ public class DropIndexStatement extends 
SchemaAlteringStatement
      * @throws InvalidRequestException if the index cannot be found and "IF 
EXISTS" is not
      * set on the statement.
      */
-    private CFMetaData lookupIndexedTable()
+    private TableMetadata lookupIndexedTable()
     {
-        KeyspaceMetadata ksm = Schema.instance.getKSMetaData(keyspace());
+        KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(keyspace());
         if (ksm == null)
             throw new KeyspaceNotDefinedException("Keyspace " + keyspace() + " 
does not exist");
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/DropKeyspaceStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/DropKeyspaceStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/DropKeyspaceStatement.java
index 6930891..21040f9 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DropKeyspaceStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DropKeyspaceStatement.java
@@ -18,13 +18,13 @@
 package org.apache.cassandra.cql3.statements;
 
 import org.apache.cassandra.auth.Permission;
-import org.apache.cassandra.cql3.Validation;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.exceptions.RequestValidationException;
 import org.apache.cassandra.exceptions.UnauthorizedException;
+import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.Event;
 
@@ -47,7 +47,7 @@ public class DropKeyspaceStatement extends 
SchemaAlteringStatement
 
     public void validate(ClientState state) throws RequestValidationException
     {
-        Validation.validateKeyspaceNotSystem(keyspace);
+        Schema.validateKeyspaceNotSystem(keyspace);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/DropTableStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/DropTableStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/DropTableStatement.java
index 5641185..83b787e 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DropTableStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DropTableStatement.java
@@ -18,16 +18,16 @@
 package org.apache.cassandra.cql3.statements;
 
 import org.apache.cassandra.auth.Permission;
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.ViewDefinition;
-import org.apache.cassandra.config.Schema;
 import org.apache.cassandra.cql3.CFName;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.exceptions.UnauthorizedException;
 import org.apache.cassandra.schema.KeyspaceMetadata;
+import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.schema.ViewMetadata;
 import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.Event;
 
@@ -63,25 +63,25 @@ public class DropTableStatement extends 
SchemaAlteringStatement
     {
         try
         {
-            KeyspaceMetadata ksm = Schema.instance.getKSMetaData(keyspace());
+            KeyspaceMetadata ksm = 
Schema.instance.getKeyspaceMetadata(keyspace());
             if (ksm == null)
                 throw new ConfigurationException(String.format("Cannot drop 
table in unknown keyspace '%s'", keyspace()));
-            CFMetaData cfm = ksm.getTableOrViewNullable(columnFamily());
-            if (cfm != null)
+            TableMetadata metadata = 
ksm.getTableOrViewNullable(columnFamily());
+            if (metadata != null)
             {
-                if (cfm.isView())
+                if (metadata.isView())
                     throw new InvalidRequestException("Cannot use DROP TABLE 
on Materialized View");
 
                 boolean rejectDrop = false;
                 StringBuilder messageBuilder = new StringBuilder();
-                for (ViewDefinition def : ksm.views)
+                for (ViewMetadata def : ksm.views)
                 {
-                    if (def.baseTableId.equals(cfm.cfId))
+                    if (def.baseTableId.equals(metadata.id))
                     {
                         if (rejectDrop)
                             messageBuilder.append(',');
                         rejectDrop = true;
-                        messageBuilder.append(def.viewName);
+                        messageBuilder.append(def.name);
                     }
                 }
                 if (rejectDrop)
@@ -91,7 +91,7 @@ public class DropTableStatement extends 
SchemaAlteringStatement
                                                                     
messageBuilder.toString()));
                 }
             }
-            MigrationManager.announceColumnFamilyDrop(keyspace(), 
columnFamily(), isLocalOnly);
+            MigrationManager.announceTableDrop(keyspace(), columnFamily(), 
isLocalOnly);
             return new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, 
Event.SchemaChange.Target.TABLE, keyspace(), columnFamily());
         }
         catch (ConfigurationException e)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/DropTriggerStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/DropTriggerStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/DropTriggerStatement.java
index 9342824..b9536fb 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DropTriggerStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DropTriggerStatement.java
@@ -20,17 +20,16 @@ package org.apache.cassandra.cql3.statements;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.Schema;
 import org.apache.cassandra.cql3.CFName;
-import org.apache.cassandra.cql3.Validation;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.exceptions.RequestValidationException;
 import org.apache.cassandra.exceptions.UnauthorizedException;
+import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.Triggers;
 import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.Event;
 
@@ -56,13 +55,13 @@ public class DropTriggerStatement extends 
SchemaAlteringStatement
 
     public void validate(ClientState state) throws RequestValidationException
     {
-        Validation.validateColumnFamily(keyspace(), columnFamily());
+        Schema.instance.validateTable(keyspace(), columnFamily());
     }
 
     public Event.SchemaChange announceMigration(QueryState queryState, boolean 
isLocalOnly) throws ConfigurationException, InvalidRequestException
     {
-        CFMetaData cfm = Schema.instance.getCFMetaData(keyspace(), 
columnFamily()).copy();
-        Triggers triggers = cfm.getTriggers();
+        TableMetadata current = Schema.instance.getTableMetadata(keyspace(), 
columnFamily());
+        Triggers triggers = current.triggers;
 
         if (!triggers.get(triggerName).isPresent())
         {
@@ -73,8 +72,14 @@ public class DropTriggerStatement extends 
SchemaAlteringStatement
         }
 
         logger.info("Dropping trigger with name {}", triggerName);
-        cfm.triggers(triggers.without(triggerName));
-        MigrationManager.announceColumnFamilyUpdate(cfm, isLocalOnly);
+
+        TableMetadata updated =
+            current.unbuild()
+                   .triggers(triggers.without(triggerName))
+                   .build();
+
+        MigrationManager.announceTableUpdate(updated, isLocalOnly);
+
         return new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, 
Event.SchemaChange.Target.TABLE, keyspace(), columnFamily());
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/DropTypeStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/DropTypeStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/DropTypeStatement.java
index cd6daae..5909888 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DropTypeStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DropTypeStatement.java
@@ -18,14 +18,16 @@
 package org.apache.cassandra.cql3.statements;
 
 import org.apache.cassandra.auth.Permission;
-import org.apache.cassandra.config.*;
 import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.cql3.functions.Function;
 import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.exceptions.*;
+import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.KeyspaceMetadata;
+import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.Event;
 
@@ -54,7 +56,7 @@ public class DropTypeStatement extends SchemaAlteringStatement
 
     public void validate(ClientState state) throws RequestValidationException
     {
-        KeyspaceMetadata ksm = 
Schema.instance.getKSMetaData(name.getKeyspace());
+        KeyspaceMetadata ksm = 
Schema.instance.getKeyspaceMetadata(name.getKeyspace());
         if (ksm == null)
         {
             if (ifExists)
@@ -92,10 +94,10 @@ public class DropTypeStatement extends 
SchemaAlteringStatement
             if (!ut.name.equals(name.getUserTypeName()) && 
ut.referencesUserType(name.getStringTypeName()))
                 throw new InvalidRequestException(String.format("Cannot drop 
user type %s as it is still used by user type %s", name, ut.getNameAsString()));
 
-        for (CFMetaData cfm : ksm.tablesAndViews())
-            for (ColumnDefinition def : cfm.allColumns())
+        for (TableMetadata table : ksm.tablesAndViews())
+            for (ColumnMetadata def : table.columns())
                 if (def.type.referencesUserType(name.getStringTypeName()))
-                    throw new InvalidRequestException(String.format("Cannot 
drop user type %s as it is still used by table %s.%s", name, cfm.ksName, 
cfm.cfName));
+                    throw new InvalidRequestException(String.format("Cannot 
drop user type %s as it is still used by table %s", name, table.toString()));
     }
 
     @Override
@@ -106,7 +108,7 @@ public class DropTypeStatement extends 
SchemaAlteringStatement
 
     public Event.SchemaChange announceMigration(QueryState queryState, boolean 
isLocalOnly) throws InvalidRequestException, ConfigurationException
     {
-        KeyspaceMetadata ksm = 
Schema.instance.getKSMetaData(name.getKeyspace());
+        KeyspaceMetadata ksm = 
Schema.instance.getKeyspaceMetadata(name.getKeyspace());
         if (ksm == null)
             return null; // do not assert (otherwise IF EXISTS case fails)
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/DropViewStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/DropViewStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/DropViewStatement.java
index 2f393d3..1909e89 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DropViewStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DropViewStatement.java
@@ -19,14 +19,14 @@
 package org.apache.cassandra.cql3.statements;
 
 import org.apache.cassandra.auth.Permission;
-import org.apache.cassandra.config.CFMetaData;
 import org.apache.cassandra.cql3.CFName;
 import org.apache.cassandra.db.view.View;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.exceptions.UnauthorizedException;
+import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.TableMetadataRef;
 import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.Event;
 
@@ -42,9 +42,9 @@ public class DropViewStatement extends SchemaAlteringStatement
 
     public void checkAccess(ClientState state) throws UnauthorizedException, 
InvalidRequestException
     {
-        CFMetaData baseTable = View.findBaseTable(keyspace(), columnFamily());
+        TableMetadataRef baseTable = View.findBaseTable(keyspace(), 
columnFamily());
         if (baseTable != null)
-            state.hasColumnFamilyAccess(keyspace(), baseTable.cfName, 
Permission.ALTER);
+            state.hasColumnFamilyAccess(keyspace(), baseTable.name, 
Permission.ALTER);
     }
 
     public void validate(ClientState state)
@@ -56,24 +56,6 @@ public class DropViewStatement extends 
SchemaAlteringStatement
     {
         try
         {
-//            ViewDefinition view = 
Schema.instance.getViewDefinition(keyspace(), columnFamily());
-//            if (view == null)
-//            {
-//                if (Schema.instance.getCFMetaData(keyspace(), 
columnFamily()) != null)
-//                    throw new ConfigurationException(String.format("Cannot 
drop table '%s' in keyspace '%s'.", columnFamily(), keyspace()));
-//
-//                throw new ConfigurationException(String.format("Cannot drop 
non existing materialized view '%s' in keyspace '%s'.", columnFamily(), 
keyspace()));
-//            }
-//
-//            CFMetaData baseCfm = 
Schema.instance.getCFMetaData(view.baseTableId);
-//            if (baseCfm == null)
-//            {
-//                if (ifExists)
-//                    throw new ConfigurationException(String.format("Cannot 
drop materialized view '%s' in keyspace '%s' without base CF.", columnFamily(), 
keyspace()));
-//                else
-//                    throw new InvalidRequestException(String.format("View 
'%s' could not be found in any of the tables of keyspace '%s'", cfName, 
keyspace()));
-//            }
-
             MigrationManager.announceViewDrop(keyspace(), columnFamily(), 
isLocalOnly);
             return new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, 
Event.SchemaChange.Target.TABLE, keyspace(), columnFamily());
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/IndexTarget.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/IndexTarget.java 
b/src/java/org/apache/cassandra/cql3/statements/IndexTarget.java
index 84af273..12d8022 100644
--- a/src/java/org/apache/cassandra/cql3/statements/IndexTarget.java
+++ b/src/java/org/apache/cassandra/cql3/statements/IndexTarget.java
@@ -19,8 +19,11 @@ package org.apache.cassandra.cql3.statements;
 
 import java.util.regex.Pattern;
 
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.ColumnDefinition;
+import com.google.common.collect.Iterables;
+
+import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.cql3.ColumnIdentifier;
 
 public class IndexTarget
@@ -28,93 +31,72 @@ public class IndexTarget
     public static final String TARGET_OPTION_NAME = "target";
     public static final String CUSTOM_INDEX_OPTION_NAME = "class_name";
 
-    /**
-     * The name of the option used to specify that the index is on the 
collection keys.
-     */
-    public static final String INDEX_KEYS_OPTION_NAME = "index_keys";
-
-    /**
-     * The name of the option used to specify that the index is on the 
collection (map) entries.
-     */
-    public static final String INDEX_ENTRIES_OPTION_NAME = 
"index_keys_and_values";
-
-    /**
-     * Regex for *unquoted* column names, anything which does not match this 
pattern must be a quoted name
-     */
-    private static final Pattern COLUMN_IDENTIFIER_PATTERN = 
Pattern.compile("[a-z_0-9]+");
-
     public final ColumnIdentifier column;
-    public final boolean quoteName;
     public final Type type;
 
     public IndexTarget(ColumnIdentifier column, Type type)
     {
         this.column = column;
         this.type = type;
-
-        // if the column name contains anything other than lower case 
alphanumerics
-        // or underscores, then it must be quoted when included in the target 
string
-        quoteName = 
!COLUMN_IDENTIFIER_PATTERN.matcher(column.toString()).matches();
     }
 
-    public String asCqlString(CFMetaData cfm)
+    public String asCqlString()
     {
-        if (!cfm.getColumnDefinition(column).type.isCollection())
-            return column.toCQLString();
-
-        return String.format("%s(%s)", type.toString(), column.toCQLString());
+        return type == Type.SIMPLE
+               ? column.toCQLString()
+               : String.format("%s(%s)", type.toString(), 
column.toCQLString());
     }
 
     public static class Raw
     {
-        private final ColumnDefinition.Raw column;
+        private final ColumnMetadata.Raw column;
         private final Type type;
 
-        private Raw(ColumnDefinition.Raw column, Type type)
+        private Raw(ColumnMetadata.Raw column, Type type)
         {
             this.column = column;
             this.type = type;
         }
 
-        public static Raw simpleIndexOn(ColumnDefinition.Raw c)
+        public static Raw simpleIndexOn(ColumnMetadata.Raw c)
         {
             return new Raw(c, Type.SIMPLE);
         }
 
-        public static Raw valuesOf(ColumnDefinition.Raw c)
+        public static Raw valuesOf(ColumnMetadata.Raw c)
         {
             return new Raw(c, Type.VALUES);
         }
 
-        public static Raw keysOf(ColumnDefinition.Raw c)
+        public static Raw keysOf(ColumnMetadata.Raw c)
         {
             return new Raw(c, Type.KEYS);
         }
 
-        public static Raw keysAndValuesOf(ColumnDefinition.Raw c)
+        public static Raw keysAndValuesOf(ColumnMetadata.Raw c)
         {
             return new Raw(c, Type.KEYS_AND_VALUES);
         }
 
-        public static Raw fullCollection(ColumnDefinition.Raw c)
+        public static Raw fullCollection(ColumnMetadata.Raw c)
         {
             return new Raw(c, Type.FULL);
         }
 
-        public IndexTarget prepare(CFMetaData cfm)
+        public IndexTarget prepare(TableMetadata table)
         {
             // Until we've prepared the target column, we can't be certain 
about the target type
             // because (for backwards compatibility) an index on a 
collection's values uses the
             // same syntax as an index on a regular column (i.e. the 'values' 
in
             // 'CREATE INDEX on table(values(collection));' is optional). So 
we correct the target type
             // when the target column is a collection & the target type is 
SIMPLE.
-            ColumnDefinition columnDef = column.prepare(cfm);
+            ColumnMetadata columnDef = column.prepare(table);
             Type actualType = (type == Type.SIMPLE && 
columnDef.type.isCollection()) ? Type.VALUES : type;
             return new IndexTarget(columnDef.name, actualType);
         }
     }
 
-    public static enum Type
+    public enum Type
     {
         VALUES, KEYS, KEYS_AND_VALUES, FULL, SIMPLE;
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/KeyspaceAttributes.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/KeyspaceAttributes.java 
b/src/java/org/apache/cassandra/cql3/statements/KeyspaceAttributes.java
index db6b0d6..d2280ce 100644
--- a/src/java/org/apache/cassandra/cql3/statements/KeyspaceAttributes.java
+++ b/src/java/org/apache/cassandra/cql3/statements/KeyspaceAttributes.java
@@ -21,6 +21,7 @@ import java.util.*;
 
 import com.google.common.collect.ImmutableSet;
 
+import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.KeyspaceParams.Option;
 import org.apache.cassandra.schema.ReplicationParams;
@@ -42,6 +43,10 @@ public final class KeyspaceAttributes extends 
PropertyDefinitions
     public void validate()
     {
         validate(validKeywords, obsoleteKeywords);
+
+        Map<String, String> replicationOptions = getAllReplicationOptions();
+        if (!replicationOptions.isEmpty() && 
!replicationOptions.containsKey(ReplicationParams.CLASS))
+            throw new ConfigurationException("Missing replication strategy 
class");
     }
 
     public String getReplicationStrategyClass()
@@ -78,4 +83,9 @@ public final class KeyspaceAttributes extends 
PropertyDefinitions
                                       : 
ReplicationParams.fromMap(getAllReplicationOptions());
         return new KeyspaceParams(durableWrites, replication);
     }
+
+    public boolean hasOption(Option option)
+    {
+        return hasProperty(option.toString());
+    }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/ListPermissionsStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/ListPermissionsStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/ListPermissionsStatement.java
index b8f2f92..be7fb5d 100644
--- 
a/src/java/org/apache/cassandra/cql3/statements/ListPermissionsStatement.java
+++ 
b/src/java/org/apache/cassandra/cql3/statements/ListPermissionsStatement.java
@@ -21,7 +21,7 @@ import java.util.*;
 
 import org.apache.cassandra.auth.*;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.config.SchemaConstants;
+import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.exceptions.InvalidRequestException;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/ListRolesStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/ListRolesStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/ListRolesStatement.java
index 3fee57a..0c0822c 100644
--- a/src/java/org/apache/cassandra/cql3/statements/ListRolesStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/ListRolesStatement.java
@@ -26,7 +26,7 @@ import com.google.common.collect.Lists;
 
 import org.apache.cassandra.auth.*;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.config.SchemaConstants;
+import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.db.marshal.BooleanType;
 import org.apache.cassandra.db.marshal.MapType;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/ListUsersStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/ListUsersStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/ListUsersStatement.java
index 0101363..9641333 100644
--- a/src/java/org/apache/cassandra/cql3/statements/ListUsersStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/ListUsersStatement.java
@@ -23,7 +23,7 @@ import com.google.common.collect.ImmutableList;
 
 import org.apache.cassandra.auth.*;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.config.SchemaConstants;
+import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.cql3.ColumnIdentifier;
 import org.apache.cassandra.cql3.ColumnSpecification;
 import org.apache.cassandra.cql3.ResultSet;

Reply via email to