diff --git a/system/host/fidl/BUILD.gn b/system/host/fidl/BUILD.gn
index 92213ff..a02cb54 100644
--- a/system/host/fidl/BUILD.gn
+++ b/system/host/fidl/BUILD.gn
@@ -12,10 +12,10 @@
   sources = [
     "lib/error_reporter.cpp",
     "lib/c_generator.cpp",
+    "lib/flat_ast.cpp",
     "lib/identifier_table.cpp",
     "lib/json_generator.cpp",
     "lib/lexer.cpp",
-    "lib/library.cpp",
     "lib/parser.cpp",
     "lib/source_file.cpp",
     "lib/source_location.cpp",
diff --git a/system/host/fidl/compiler/main.cpp b/system/host/fidl/compiler/main.cpp
index 5206df7..c270c29 100644
--- a/system/host/fidl/compiler/main.cpp
+++ b/system/host/fidl/compiler/main.cpp
@@ -13,10 +13,10 @@
 #include <vector>
 
 #include <fidl/c_generator.h>
+#include <fidl/flat_ast.h>
 #include <fidl/identifier_table.h>
 #include <fidl/json_generator.h>
 #include <fidl/lexer.h>
-#include <fidl/library.h>
 #include <fidl/parser.h>
 #include <fidl/source_manager.h>
 
@@ -134,7 +134,7 @@
 
 bool Parse(Arguments* args, fidl::SourceManager* source_manager,
            fidl::IdentifierTable* identifier_table, fidl::ErrorReporter* error_reporter,
-           fidl::Library* library) {
+           fidl::flat::Library* library) {
     while (args->Remaining()) {
         std::string filename = args->Claim();
         const fidl::SourceFile* source = source_manager->CreateSource(filename.data());
@@ -158,14 +158,14 @@
     }
 
     if (!library->Resolve()) {
-        fprintf(stderr, "Library resolution failed!\n");
+        fprintf(stderr, "flat::Library resolution failed!\n");
         return false;
     }
 
     return true;
 }
 
-bool GenerateC(fidl::Library* library, std::fstream header_output) {
+bool GenerateC(fidl::flat::Library* library, std::fstream header_output) {
     std::ostringstream header_file;
     fidl::CGenerator c_generator(library);
 
@@ -178,7 +178,7 @@
     return true;
 }
 
-bool GenerateJSON(fidl::Library* library, std::fstream json_output) {
+bool GenerateJSON(fidl::flat::Library* library, std::fstream json_output) {
     std::ostringstream json_file;
     fidl::JSONGenerator json_generator(library);
 
@@ -234,7 +234,7 @@
     fidl::SourceManager source_manager;
     fidl::IdentifierTable identifier_table;
     fidl::ErrorReporter error_reporter;
-    fidl::Library library;
+    fidl::flat::Library library;
     if (!Parse(args, &source_manager, &identifier_table, &error_reporter, &library)) {
         return 1;
     }
diff --git a/system/host/fidl/include/fidl/c_generator.h b/system/host/fidl/include/fidl/c_generator.h
index 90a10ed..fb2ea8d 100644
--- a/system/host/fidl/include/fidl/c_generator.h
+++ b/system/host/fidl/include/fidl/c_generator.h
@@ -10,7 +10,7 @@
 #include <vector>
 
 #include "coded_ast.h"
-#include "library.h"
+#include "flat_ast.h"
 #include "string_view.h"
 
 namespace fidl {
@@ -27,7 +27,7 @@
 
 class CGenerator {
 public:
-    explicit CGenerator(Library* library) : library_(library) {}
+    explicit CGenerator(flat::Library* library) : library_(library) {}
 
     ~CGenerator() = default;
 
@@ -111,7 +111,7 @@
     void ProduceStructDeclaration(const NamedStruct& named_struct);
     void ProduceUnionDeclaration(const NamedUnion& named_union);
 
-    Library* library_;
+    flat::Library* library_;
     std::ostringstream header_file_;
 };
 
diff --git a/system/host/fidl/include/fidl/flat_ast.h b/system/host/fidl/include/fidl/flat_ast.h
index 185e834..c18ff81 100644
--- a/system/host/fidl/include/fidl/flat_ast.h
+++ b/system/host/fidl/include/fidl/flat_ast.h
@@ -5,12 +5,16 @@
 #ifndef ZIRCON_SYSTEM_HOST_FIDL_INCLUDE_FIDL_FLAT_AST_H_
 #define ZIRCON_SYSTEM_HOST_FIDL_INCLUDE_FIDL_FLAT_AST_H_
 
+#include <errno.h>
 #include <stdint.h>
 
+#include <map>
 #include <memory>
+#include <set>
 #include <vector>
 
 #include "ast.h"
+#include "type_shape.h"
 
 namespace fidl {
 namespace flat {
@@ -151,6 +155,133 @@
     uint64_t size = 8;
 };
 
+class Library {
+public:
+    bool ConsumeFile(std::unique_ptr<ast::File> file);
+    bool Resolve();
+
+private:
+    bool ConsumeConstDeclaration(std::unique_ptr<ast::ConstDeclaration> const_declaration);
+    bool ConsumeEnumDeclaration(std::unique_ptr<ast::EnumDeclaration> enum_declaration);
+    bool
+    ConsumeInterfaceDeclaration(std::unique_ptr<ast::InterfaceDeclaration> interface_declaration);
+    bool ConsumeStructDeclaration(std::unique_ptr<ast::StructDeclaration> struct_declaration);
+    bool ConsumeUnionDeclaration(std::unique_ptr<ast::UnionDeclaration> union_declaration);
+
+    bool RegisterTypeName(const Name& name);
+
+    bool ResolveConst(const Const& const_declaration);
+    bool ResolveEnum(const Enum& enum_declaration);
+    bool ResolveInterface(const Interface& interface_declaration);
+    bool ResolveStruct(const Struct& struct_declaration);
+    bool ResolveUnion(const Union& union_declaration);
+
+    bool ResolveArrayType(const ast::ArrayType& array_type, TypeShape* out_type_metadata);
+    bool ResolveVectorType(const ast::VectorType& vector_type, TypeShape* out_type_metadata);
+    bool ResolveStringType(const ast::StringType& string_type, TypeShape* out_type_metadata);
+    bool ResolveHandleType(const ast::HandleType& handle_type, TypeShape* out_type_metadata);
+    bool ResolveRequestType(const ast::RequestType& request_type, TypeShape* out_type_metadata);
+    bool ResolvePrimitiveType(const ast::PrimitiveType& primitive_type,
+                              TypeShape* out_type_metadata);
+    bool ResolveIdentifierType(const ast::IdentifierType& identifier_type,
+                               TypeShape* out_type_metadata);
+    bool ResolveType(const ast::Type* type) {
+        TypeShape type_metadata;
+        return ResolveType(type, &type_metadata);
+    }
+    bool ResolveType(const ast::Type* type, TypeShape* out_type_metadata);
+    bool ResolveTypeName(const ast::CompoundIdentifier* name);
+    bool RegisterResolvedType(const Name& name, TypeShape type_metadata);
+
+    bool LookupTypeShape(const Name& name, TypeShape* out_typeshape);
+
+public:
+    // TODO(TO-702) Add a validate literal function. Some things
+    // (e.g. array indexes) want to check the value but print the
+    // constant, say.
+    template <typename IntType>
+    bool ParseIntegerLiteral(const ast::NumericLiteral* literal, IntType* out_value) {
+        if (!literal) {
+            return false;
+        }
+        auto data = literal->location.data();
+        std::string string_data(data.data(), data.data() + data.size());
+        if (std::is_unsigned<IntType>::value) {
+            errno = 0;
+            unsigned long long value = strtoull(string_data.data(), nullptr, 0);
+            if (errno != 0)
+                return false;
+            if (value > std::numeric_limits<IntType>::max())
+                return false;
+            *out_value = static_cast<IntType>(value);
+        } else {
+            errno = 0;
+            long long value = strtoll(string_data.data(), nullptr, 0);
+            if (errno != 0) {
+                return false;
+            }
+            if (value > std::numeric_limits<IntType>::max()) {
+                return false;
+            }
+            if (value < std::numeric_limits<IntType>::min()) {
+                return false;
+            }
+            *out_value = static_cast<IntType>(value);
+        }
+        return true;
+    }
+
+    template <typename IntType>
+    bool ParseIntegerConstant(const ast::Constant* constant, IntType* out_value) {
+        if (!constant) {
+            return false;
+        }
+        switch (constant->kind) {
+        case ast::Constant::Kind::Identifier: {
+            auto identifier_constant = static_cast<const ast::IdentifierConstant*>(constant);
+            auto identifier = identifier_constant->identifier.get();
+            // TODO(TO-702) Actually resolve this.
+            static_cast<void>(identifier);
+            *out_value = static_cast<IntType>(123);
+            return true;
+        }
+        case ast::Constant::Kind::Literal: {
+            auto literal_constant = static_cast<const ast::LiteralConstant*>(constant);
+            switch (literal_constant->literal->kind) {
+            case ast::Literal::Kind::String:
+            case ast::Literal::Kind::True:
+            case ast::Literal::Kind::False:
+            case ast::Literal::Kind::Default: {
+                return false;
+            }
+
+            case ast::Literal::Kind::Numeric: {
+                auto numeric_literal =
+                    static_cast<const ast::NumericLiteral*>(literal_constant->literal.get());
+                return ParseIntegerLiteral<IntType>(numeric_literal, out_value);
+            }
+            }
+        }
+        }
+    }
+
+    std::unique_ptr<ast::Identifier> library_name_;
+
+    std::vector<Const> const_declarations_;
+    std::vector<Enum> enum_declarations_;
+    std::vector<Interface> interface_declarations_;
+    std::vector<Struct> struct_declarations_;
+    std::vector<Union> union_declarations_;
+
+    // TODO(TO-773) Compute this based on the DAG of aggregates
+    // including each other as members.
+    std::vector<Name> declaration_order_;
+
+private:
+    std::set<Name> registered_types_;
+    std::map<Name, TypeShape> resolved_types_;
+};
+
 } // namespace flat
 } // namespace fidl
 
diff --git a/system/host/fidl/include/fidl/json_generator.h b/system/host/fidl/include/fidl/json_generator.h
index 2d13430..2fbb904 100644
--- a/system/host/fidl/include/fidl/json_generator.h
+++ b/system/host/fidl/include/fidl/json_generator.h
@@ -12,7 +12,6 @@
 
 #include "coded_ast.h"
 #include "flat_ast.h"
-#include "library.h"
 #include "string_view.h"
 
 namespace fidl {
@@ -29,7 +28,7 @@
 
 class JSONGenerator {
 public:
-    explicit JSONGenerator(Library* library)
+    explicit JSONGenerator(flat::Library* library)
         : library_(library) {}
 
     ~JSONGenerator() = default;
@@ -89,7 +88,7 @@
 
     void GenerateDeclarationMapEntry(int count, const flat::Name& name, StringView decl);
 
-    Library* library_;
+    flat::Library* library_;
     int indent_level_;
     std::ostringstream json_file_;
 };
diff --git a/system/host/fidl/include/fidl/library.h b/system/host/fidl/include/fidl/library.h
deleted file mode 100644
index 40d068f..0000000
--- a/system/host/fidl/include/fidl/library.h
+++ /dev/null
@@ -1,160 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ZIRCON_SYSTEM_HOST_FIDL_INCLUDE_FIDL_LIBRARY_H_
-#define ZIRCON_SYSTEM_HOST_FIDL_INCLUDE_FIDL_LIBRARY_H_
-
-#include <errno.h>
-
-#include <map>
-#include <memory>
-#include <set>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "ast.h"
-#include "coded_ast.h"
-#include "flat_ast.h"
-#include "identifier_table.h"
-#include "source_manager.h"
-#include "type_shape.h"
-
-namespace fidl {
-
-class Library {
-public:
-    bool ConsumeFile(std::unique_ptr<ast::File> file);
-    bool Resolve();
-
-private:
-    bool ConsumeConstDeclaration(std::unique_ptr<ast::ConstDeclaration> const_declaration);
-    bool ConsumeEnumDeclaration(std::unique_ptr<ast::EnumDeclaration> enum_declaration);
-    bool
-    ConsumeInterfaceDeclaration(std::unique_ptr<ast::InterfaceDeclaration> interface_declaration);
-    bool ConsumeStructDeclaration(std::unique_ptr<ast::StructDeclaration> struct_declaration);
-    bool ConsumeUnionDeclaration(std::unique_ptr<ast::UnionDeclaration> union_declaration);
-
-    bool RegisterTypeName(const flat::Name& name);
-
-    bool ResolveConst(const flat::Const& const_declaration);
-    bool ResolveEnum(const flat::Enum& enum_declaration);
-    bool ResolveInterface(const flat::Interface& interface_declaration);
-    bool ResolveStruct(const flat::Struct& struct_declaration);
-    bool ResolveUnion(const flat::Union& union_declaration);
-
-    bool ResolveArrayType(const ast::ArrayType& array_type, TypeShape* out_type_metadata);
-    bool ResolveVectorType(const ast::VectorType& vector_type, TypeShape* out_type_metadata);
-    bool ResolveStringType(const ast::StringType& string_type, TypeShape* out_type_metadata);
-    bool ResolveHandleType(const ast::HandleType& handle_type, TypeShape* out_type_metadata);
-    bool ResolveRequestType(const ast::RequestType& request_type, TypeShape* out_type_metadata);
-    bool ResolvePrimitiveType(const ast::PrimitiveType& primitive_type,
-                              TypeShape* out_type_metadata);
-    bool ResolveIdentifierType(const ast::IdentifierType& identifier_type,
-                               TypeShape* out_type_metadata);
-    bool ResolveType(const ast::Type* type) {
-        TypeShape type_metadata;
-        return ResolveType(type, &type_metadata);
-    }
-    bool ResolveType(const ast::Type* type, TypeShape* out_type_metadata);
-    bool ResolveTypeName(const ast::CompoundIdentifier* name);
-    bool RegisterResolvedType(const flat::Name& name, TypeShape type_metadata);
-
-    bool LookupTypeShape(const flat::Name& name, TypeShape* out_typeshape);
-
-    const coded::Type* LookupIdentifierType(const ast::IdentifierType* identifier_type);
-
-    void MaybeCreateCodingField(std::string field_name, uint32_t offset, const ast::Type* type,
-                                std::vector<coded::Field>* fields);
-
-public:
-    // TODO(TO-702) Add a validate literal function. Some things
-    // (e.g. array indexes) want to check the value but print the
-    // constant, say.
-    template <typename IntType>
-    bool ParseIntegerLiteral(const ast::NumericLiteral* literal, IntType* out_value) {
-        if (!literal) {
-            return false;
-        }
-        auto data = literal->location.data();
-        std::string string_data(data.data(), data.data() + data.size());
-        if (std::is_unsigned<IntType>::value) {
-            errno = 0;
-            unsigned long long value = strtoull(string_data.data(), nullptr, 0);
-            if (errno != 0)
-                return false;
-            if (value > std::numeric_limits<IntType>::max())
-                return false;
-            *out_value = static_cast<IntType>(value);
-        } else {
-            errno = 0;
-            long long value = strtoll(string_data.data(), nullptr, 0);
-            if (errno != 0) {
-                return false;
-            }
-            if (value > std::numeric_limits<IntType>::max()) {
-                return false;
-            }
-            if (value < std::numeric_limits<IntType>::min()) {
-                return false;
-            }
-            *out_value = static_cast<IntType>(value);
-        }
-        return true;
-    }
-
-    template <typename IntType>
-    bool ParseIntegerConstant(const ast::Constant* constant, IntType* out_value) {
-        if (!constant) {
-            return false;
-        }
-        switch (constant->kind) {
-        case ast::Constant::Kind::Identifier: {
-            auto identifier_constant = static_cast<const ast::IdentifierConstant*>(constant);
-            auto identifier = identifier_constant->identifier.get();
-            // TODO(TO-702) Actually resolve this.
-            static_cast<void>(identifier);
-            *out_value = static_cast<IntType>(123);
-            return true;
-        }
-        case ast::Constant::Kind::Literal: {
-            auto literal_constant = static_cast<const ast::LiteralConstant*>(constant);
-            switch (literal_constant->literal->kind) {
-            case ast::Literal::Kind::String:
-            case ast::Literal::Kind::True:
-            case ast::Literal::Kind::False:
-            case ast::Literal::Kind::Default: {
-                return false;
-            }
-
-            case ast::Literal::Kind::Numeric: {
-                auto numeric_literal =
-                    static_cast<const ast::NumericLiteral*>(literal_constant->literal.get());
-                return ParseIntegerLiteral<IntType>(numeric_literal, out_value);
-            }
-            }
-        }
-        }
-    }
-
-    std::unique_ptr<ast::Identifier> library_name_;
-
-    std::vector<flat::Const> const_declarations_;
-    std::vector<flat::Enum> enum_declarations_;
-    std::vector<flat::Interface> interface_declarations_;
-    std::vector<flat::Struct> struct_declarations_;
-    std::vector<flat::Union> union_declarations_;
-
-    // TODO(TO-773) Compute this based on the DAG of aggregates
-    // including each other as members.
-    std::vector<flat::Name> declaration_order_;
-
-private:
-    std::set<flat::Name> registered_types_;
-    std::map<flat::Name, TypeShape> resolved_types_;
-};
-
-} // namespace fidl
-
-#endif // ZIRCON_SYSTEM_HOST_FIDL_INCLUDE_FIDL_LIBRARY_H_
diff --git a/system/host/fidl/lib/c_generator.cpp b/system/host/fidl/lib/c_generator.cpp
index 02b4783..de21c7b 100644
--- a/system/host/fidl/lib/c_generator.cpp
+++ b/system/host/fidl/lib/c_generator.cpp
@@ -205,7 +205,7 @@
 }
 
 void EnumValue(types::PrimitiveSubtype type, const ast::Constant* constant,
-               Library* library, std::string* out_value) {
+               flat::Library* library, std::string* out_value) {
     // TODO(kulakowski) Move this into library resolution.
 
     std::ostringstream member_value;
@@ -298,7 +298,7 @@
     *out_value = member_value.str();
 }
 
-std::vector<uint32_t> ArrayCounts(Library* library, const ast::Type* type) {
+std::vector<uint32_t> ArrayCounts(flat::Library* library, const ast::Type* type) {
     std::vector<uint32_t> array_counts;
     for (;;) {
         switch (type->kind) {
@@ -320,14 +320,14 @@
     }
 }
 
-CGenerator::Member CreateMember(Library* library, const ast::Type* type, StringView name) {
+CGenerator::Member CreateMember(flat::Library* library, const ast::Type* type, StringView name) {
     auto type_name = TypeName(type);
     std::vector<uint32_t> array_counts = ArrayCounts(library, type);
     return CGenerator::Member{type_name, name, std::move(array_counts)};
 }
 
 std::vector<CGenerator::Member>
-GenerateMembers(Library* library, const std::vector<flat::Union::Member>& union_members) {
+GenerateMembers(flat::Library* library, const std::vector<flat::Union::Member>& union_members) {
     std::vector<CGenerator::Member> members;
     members.reserve(union_members.size());
     for (const auto& union_member : union_members) {
diff --git a/system/host/fidl/lib/library.cpp b/system/host/fidl/lib/flat_ast.cpp
similarity index 93%
rename from system/host/fidl/lib/library.cpp
rename to system/host/fidl/lib/flat_ast.cpp
index e9fa649..3bc9ffb 100644
--- a/system/host/fidl/lib/library.cpp
+++ b/system/host/fidl/lib/flat_ast.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "fidl/library.h"
+#include "fidl/flat_ast.h"
 
 #include <assert.h>
 #include <stdio.h>
@@ -15,6 +15,7 @@
 #include "fidl/parser.h"
 
 namespace fidl {
+namespace flat {
 
 namespace {
 
@@ -113,7 +114,7 @@
 // so on.
 
 bool Library::ConsumeConstDeclaration(std::unique_ptr<ast::ConstDeclaration> const_declaration) {
-    auto name = flat::Name(std::move(const_declaration->identifier));
+    auto name = Name(std::move(const_declaration->identifier));
 
     if (!RegisterTypeName(name))
         return false;
@@ -123,16 +124,16 @@
 }
 
 bool Library::ConsumeEnumDeclaration(std::unique_ptr<ast::EnumDeclaration> enum_declaration) {
-    std::vector<flat::Enum::Member> members;
+    std::vector<Enum::Member> members;
     for (auto& member : enum_declaration->members) {
-        auto name = flat::Name(std::move(member->identifier));
+        auto name = Name(std::move(member->identifier));
         auto value = std::move(member->value);
         members.emplace_back(std::move(name), std::move(value));
     }
     std::unique_ptr<ast::PrimitiveType> type = std::move(enum_declaration->maybe_subtype);
     if (!type)
         type = std::make_unique<ast::PrimitiveType>(types::PrimitiveSubtype::Uint32);
-    auto name = flat::Name(std::move(enum_declaration->identifier));
+    auto name = Name(std::move(enum_declaration->identifier));
 
     if (!RegisterTypeName(name))
         return false;
@@ -142,7 +143,7 @@
 
 bool Library::ConsumeInterfaceDeclaration(
     std::unique_ptr<ast::InterfaceDeclaration> interface_declaration) {
-    auto name = flat::Name(std::move(interface_declaration->identifier));
+    auto name = Name(std::move(interface_declaration->identifier));
 
     for (auto& const_member : interface_declaration->const_members)
         if (!ConsumeConstDeclaration(std::move(const_member)))
@@ -151,7 +152,7 @@
         if (!ConsumeEnumDeclaration(std::move(enum_member)))
             return false;
 
-    std::vector<flat::Interface::Method> methods;
+    std::vector<Interface::Method> methods;
     for (auto& method : interface_declaration->method_members) {
         auto ordinal_literal = std::move(method->ordinal);
         uint32_t value;
@@ -159,12 +160,12 @@
             return false;
         if (value == 0u)
             return false;
-        flat::Ordinal ordinal(std::move(ordinal_literal), value);
+        Ordinal ordinal(std::move(ordinal_literal), value);
 
         auto method_name = std::move(method->identifier);
 
         bool has_request = static_cast<bool>(method->maybe_request);
-        std::vector<flat::Interface::Method::Parameter> maybe_request;
+        std::vector<Interface::Method::Parameter> maybe_request;
         if (has_request) {
             for (auto& parameter : method->maybe_request->parameter_list) {
                 auto parameter_name = std::move(parameter->identifier);
@@ -173,7 +174,7 @@
         }
 
         bool has_response = static_cast<bool>(method->maybe_response);
-        std::vector<flat::Interface::Method::Parameter> maybe_response;
+        std::vector<Interface::Method::Parameter> maybe_response;
         if (has_response) {
             for (auto& parameter : method->maybe_response->parameter_list) {
                 auto response_paramater_name = std::move(parameter->identifier);
@@ -196,7 +197,7 @@
 }
 
 bool Library::ConsumeStructDeclaration(std::unique_ptr<ast::StructDeclaration> struct_declaration) {
-    auto name = flat::Name(std::move(struct_declaration->identifier));
+    auto name = Name(std::move(struct_declaration->identifier));
 
     for (auto& const_member : struct_declaration->const_members)
         if (!ConsumeConstDeclaration(std::move(const_member)))
@@ -205,7 +206,7 @@
         if (!ConsumeEnumDeclaration(std::move(enum_member)))
             return false;
 
-    std::vector<flat::Struct::Member> members;
+    std::vector<Struct::Member> members;
     for (auto& member : struct_declaration->members) {
         auto name = std::move(member->identifier);
         members.emplace_back(std::move(member->type), std::move(name),
@@ -219,12 +220,12 @@
 }
 
 bool Library::ConsumeUnionDeclaration(std::unique_ptr<ast::UnionDeclaration> union_declaration) {
-    std::vector<flat::Union::Member> members;
+    std::vector<Union::Member> members;
     for (auto& member : union_declaration->members) {
         auto name = std::move(member->identifier);
         members.emplace_back(std::move(member->type), std::move(name));
     }
-    auto name = flat::Name(std::move(union_declaration->identifier));
+    auto name = Name(std::move(union_declaration->identifier));
 
     if (!RegisterTypeName(name))
         return false;
@@ -289,14 +290,14 @@
     return true;
 }
 
-bool Library::RegisterTypeName(const flat::Name& name) {
+bool Library::RegisterTypeName(const Name& name) {
     // TODO(TO-701) Should this copy the Name?
     // auto iter = registered_types_.insert(name);
     // return iter.second;
     return true;
 }
 
-bool Library::RegisterResolvedType(const flat::Name& name, TypeShape typeshape) {
+bool Library::RegisterResolvedType(const Name& name, TypeShape typeshape) {
     // TODO(TO-701) Should this copy the Name?
     // auto key_value = std::make_pair(name, typeshape);
     // auto iter = resolved_types_.insert(std::move(key_value));
@@ -304,7 +305,7 @@
     return true;
 }
 
-bool Library::LookupTypeShape(const flat::Name& name, TypeShape* out_typeshape) {
+bool Library::LookupTypeShape(const Name& name, TypeShape* out_typeshape) {
     auto iter = resolved_types_.find(name);
     if (iter == resolved_types_.end()) {
         return false;
@@ -316,7 +317,7 @@
 // Library resolution is concerned with resolving identifiers to their
 // declarations, and with computing type sizes and alignments.
 
-bool Library::ResolveConst(const flat::Const& const_declaration) {
+bool Library::ResolveConst(const Const& const_declaration) {
     if (!ResolveType(const_declaration.type.get())) {
         return false;
     }
@@ -324,7 +325,7 @@
     return true;
 }
 
-bool Library::ResolveEnum(const flat::Enum& enum_declaration) {
+bool Library::ResolveEnum(const Enum& enum_declaration) {
     TypeShape typeshape;
 
     switch (enum_declaration.type->subtype) {
@@ -357,7 +358,7 @@
     return true;
 }
 
-bool Library::ResolveInterface(const flat::Interface& interface_declaration) {
+bool Library::ResolveInterface(const Interface& interface_declaration) {
     // TODO(TO-703) Add subinterfaces here.
     Scope<StringView> name_scope;
     Scope<uint32_t> ordinal_scope;
@@ -388,7 +389,7 @@
     return true;
 }
 
-bool Library::ResolveStruct(const flat::Struct& struct_declaration) {
+bool Library::ResolveStruct(const Struct& struct_declaration) {
     Scope<StringView> scope;
     std::vector<TypeShape> member_typeshapes;
     for (const auto& member : struct_declaration.members) {
@@ -407,7 +408,7 @@
     return true;
 }
 
-bool Library::ResolveUnion(const flat::Union& union_declaration) {
+bool Library::ResolveUnion(const Union& union_declaration) {
     Scope<StringView> scope;
     std::vector<TypeShape> member_typeshapes;
     for (const auto& member : union_declaration.members) {
@@ -620,4 +621,5 @@
     return true;
 }
 
+} // namespace flat
 } // namespace fidl
diff --git a/system/host/fidl/rules.mk b/system/host/fidl/rules.mk
index 6a6478c..3817666 100644
--- a/system/host/fidl/rules.mk
+++ b/system/host/fidl/rules.mk
@@ -13,10 +13,10 @@
 MODULE_SRCS := \
     $(LOCAL_DIR)/lib/c_generator.cpp \
     $(LOCAL_DIR)/lib/error_reporter.cpp \
+    $(LOCAL_DIR)/lib/flat_ast.cpp \
     $(LOCAL_DIR)/lib/identifier_table.cpp \
     $(LOCAL_DIR)/lib/json_generator.cpp \
     $(LOCAL_DIR)/lib/lexer.cpp \
-    $(LOCAL_DIR)/lib/library.cpp \
     $(LOCAL_DIR)/lib/parser.cpp \
     $(LOCAL_DIR)/lib/source_file.cpp \
     $(LOCAL_DIR)/lib/source_location.cpp \
