diff --git a/aspnetcore/toc.yml b/aspnetcore/toc.yml
index 350a0625bdaa..cb14730c1dbc 100644
--- a/aspnetcore/toc.yml
+++ b/aspnetcore/toc.yml
@@ -444,7 +444,7 @@
- name: Get started
uid: razor-components/get-started
- name: Build your first app
- uid: tutorials/first-blazor-app
+ uid: tutorials/first-razor-components-app
- name: Components
uid: razor-components/components
- name: Component libraries
diff --git a/aspnetcore/tutorials/build-your-first-blazor-app.md b/aspnetcore/tutorials/build-your-first-blazor-app.md
deleted file mode 100644
index f164b10359bc..000000000000
--- a/aspnetcore/tutorials/build-your-first-blazor-app.md
+++ /dev/null
@@ -1,479 +0,0 @@
----
-title: Build your first Blazor app
-author: guardrex
-description: Build a Blazor app step-by-step and quickly learn the basic features of the Razor Components framework.
-monikerRange: '>= aspnetcore-3.0'
-ms.author: riande
-ms.custom: mvc
-ms.date: 01/29/2019
-uid: tutorials/first-blazor-app
----
-# Build your first Blazor app
-
-[!INCLUDE[](~/includes/razor-components-preview-notice.md)]
-
-In this tutorial, you build a Blazor app step-by-step and quickly learn the basic features of the Razor Components framework.
-
-[View or download sample code](https://github.com/aspnet/Docs/tree/master/aspnetcore/tutorials/build-your-first-blazor-app/samples/) ([how to download](xref:index#how-to-download-a-sample)). See the [Get started](xref:razor-components/get-started) topic for prerequisites.
-
-To create the project in Visual Studio:
-
-1. Select **File** > **New** > **Project**. Select **Web** > **ASP.NET Core Web Application**. Name the project "BlazorApp1" in the **Name** field. Select **OK**.
-
- 
-
-1. The **New ASP.NET Core Web Application** dialog appears. Make sure **.NET Core** is selected at the top. Select **ASP.NET Core 2.1**. Choose the **Blazor** template and select **OK**.
-
- 
-
-1. Once the project is created, press **Ctrl-F5** to run the app *without the debugger*. Running with the debugger (**F5**) isn't supported at this time.
-
-> [!NOTE]
-> If not using Visual Studio, create the Blazor app at a command prompt on Windows, macOS, or Linux:
->
-> ```console
-> dotnet new --install "Microsoft.AspNetCore.Blazor.Templates"
-> dotnet new blazor -o BlazorApp1
-> cd BlazorApp1
-> dotnet run
-> ```
->
-> Navigate to the app using the localhost address and port provided in the console window output after `dotnet run` is executed. Use **Ctrl-C** in the console window to shutdown the app.
-
-The Blazor app runs in the browser:
-
-
-
-## Build components
-
-1. Browse to each of the app's three pages: Home, Counter, and Fetch data.
-
- These three pages are implemented by the three Razor files in the *Pages* folder: *Index.cshtml*, *Counter.cshtml*, and *FetchData.cshtml*. Each of these files implements a component that's compiled and executed client-side in the browser.
-
-1. Select the button on the Counter page.
-
- 
-
- Each time the button is selected, the counter is incremented without a page refresh. Normally, this kind of client-side behavior is handled in JavaScript; but here, it's implemented in C# and .NET by the `Counter` component.
-
-1. Take a look at the implementation of the `Counter` component in the *Counter.cshtml* file:
-
- ```cshtml
- @page "/counter"
-
-
Counter
-
-
Current count: @currentCount
-
-
-
- @functions {
- int currentCount = 0;
-
- void IncrementCount()
- {
- currentCount++;
- }
- }
- ```
-
- The UI for the `Counter` component is defined using normal HTML. Dynamic rendering logic (for example, loops, conditionals, expressions) is added using an embedded C# syntax called [Razor](https://docs.microsoft.com/aspnet/core/mvc/views/razor). The HTML markup and C# rendering logic are converted into a component class at build time. The name of the generated .NET class matches the name of the file.
-
- Members of the component class are defined in a `@functions` block. In the `@functions` block, component state (properties, fields) and methods can be specified for event handling or for defining other component logic. These members can then be used as part of the component's rendering logic and for handling events.
-
- When the button is selected, the `Counter` component's registered `onclick` handler is called (the `IncrementCount` method) and the `Counter` component regenerates its render tree. Blazor compares the new render tree against the previous one and applies any modifications to the browser Document Object Model (DOM). The displayed count is updated.
-
-1. Update the markup for the `Counter` component to make the top-level header more *exciting*.
-
- ```cshtml
- @page "/counter"
-
Counter!!
- ```
-
-1. Also modify the C# logic of the `Counter` component to make the count increment by two instead of one.
-
- ```cshtml
- @functions {
- int currentCount = 0;
-
- void IncrementCount()
- {
- currentCount += 2;
- }
- }
- ```
-
-1. Refresh the counter page in the browser to see the changes.
-
- 
-
-## Use components
-
-After a component is defined, the component can be used to implement other components. The markup for using a component looks like an HTML tag where the name of the tag is the component type.
-
-1. Add a `Counter` component to the Home page of the app (*Index.cshtml*).
-
- ```cshtml
- @page "/"
-
-
Hello, world!
-
- Welcome to your new app.
-
-
-
-
- ```
-
-1. Refresh the home page in the browser. Note the separate instance of the `Counter` component on the Home page.
-
- 
-
-## Component parameters
-
-Components can also have parameters, which are defined using private properties on the component class decorated with `[Parameter]`. Use attributes to specify arguments for a component in markup.
-
-1. Update the `Counter` component to have an `IncrementAmount` parameter that defaults to 1.
-
- ```cshtml
- @functions {
- int currentCount = 0;
-
- [Parameter]
- private int IncrementAmount { get; set; } = 1;
-
- void IncrementCount()
- {
- currentCount += IncrementAmount;
- }
- }
- ```
-
- > [!NOTE]
- > From Visual Studio, you can quickly add a component parameter by using the `para` snippet. Type `para` and then press the `Tab` key twice.
-
-1. On the Home page (*Index.cshtml*), change the increment amount for the `Counter` to 10 by setting an attribute that matches the name of the component's property for `IncrementCount`.
-
- ```cshtml
-
- ```
-
-1. Reload the page.
-
- The counter on the Home page now increments by 10, while the counter on the Counter page still increments by 1.
-
- 
-
-## Route to components
-
-The `@page` directive at the top of the *Counter.cshtml* file specifies that this component is a page to which requests can be routed. Specifically, the `Counter` component handles requests sent to `/Counter`. Without the `@page` directive, the component wouldn't handle routed requests, but the component could still be used by other components.
-
-## Dependency injection
-
-Services registered with the app's service provider are available to components via [dependency injection (DI)](https://docs.microsoft.com/aspnet/core/fundamentals/dependency-injection). Services can be injected into a component using the `@inject` directive.
-
-Take a look at the implementation of the `FetchData` component in *FetchData.cshtml*. The `@inject` directive is used to inject an [HttpClient](https://docs.microsoft.com/dotnet/api/system.net.http.httpclient) instance into the component.
-
-```cshtml
-@page "/fetchdata"
-@inject HttpClient Http
-```
-
-The `FetchData` component uses the injected `HttpClient` to retrieve JSON data from the server when the component is initialized. Under the covers, the `HttpClient` provided by the Blazor runtime is implemented using JavaScript interop to call the underlying browser's Fetch API to send the request (from C#, it's possible to call any JavaScript library or browser API). The retrieved data is deserialized into the `forecasts` C# variable as an array of `WeatherForecast` objects.
-
-```cshtml
-@functions {
- WeatherForecast[] forecasts;
-
- protected override async Task OnInitAsync()
- {
- forecasts = await Http.GetJsonAsync("/sample-data/weather.json");
- }
-
- class WeatherForecast
- {
- public DateTime Date { get; set; }
- public int TemperatureC { get; set; }
- public int TemperatureF { get; set; }
- public string Summary { get; set; }
- }
-}
-```
-
-A `@foreach` loop is used to render each forecast instance as a row in the weather table.
-
-```cshtml
-
-
-
-
Date
-
Temp. (C)
-
Temp. (F)
-
Summary
-
-
-
- @foreach (var forecast in forecasts)
- {
-
-
@forecast.Date.ToShortDateString()
-
@forecast.TemperatureC
-
@forecast.TemperatureF
-
@forecast.Summary
-
- }
-
-
-```
-
-## Build a todo list
-
-Add a new page to the app that implements a simple todo list.
-
-1. Add an empty text file to the *Pages* folder named *Todo.cshtml*.
-
-1. Provide the initial markup for the page.
-
- ```cshtml
- @page "/todo"
-
-
Todo
- ```
-
-1. Add the Todo page to the navigation bar by updating *Shared/NavMenu.cshtml*. Add a `NavLink` for the Todo page by adding the following list item markup below the existing list items.
-
- ```cshtml
-
-
- Todo
-
-
- ```
-
-1. Refresh the app in the browser. See the new Todo page.
-
- 
-
-1. Add a *TodoItem.cs* file to the root of the project to hold a class to represent the todo items.
-
-1. Use the following C# code for the `TodoItem` class.
-
- ```csharp
- public class TodoItem
- {
- public string Title { get; set; }
- public bool IsDone { get; set; }
- }
- ```
-
-1. Go back to the `Todo` component in *Todo.cshtml* and add a field for the todos in a `@functions` block. The `Todo` component uses this field to maintain the state of the todo list.
-
- ```cshtml
- @functions {
- IList todos = new List();
- }
- ```
-
-1. Add unordered list markup and a `foreach` loop to render each todo item as a list item.
-
- ```cshtml
- @page "/todo"
-
-
Todo
-
-
- @foreach (var todo in todos)
- {
-
@todo.Title
- }
-
- ```
-
-1. The app requires UI elements for adding todos to the list. Add a text input and a button below the list.
-
- ```cshtml
- @page "/todo"
-
-
Todo
-
-
- @foreach (var todo in todos)
- {
-
@todo.Title
- }
-
-
-
-
-
- @functions {
- IList todos = new List();
- }
- ```
-
-1. Refresh the browser.
-
- 
-
- Nothing happens when the **Add todo** button is selected because no event handler is wired up to the button.
-
-1. Add an `AddTodo` method to the `Todo` component and register it for button clicks using the `onclick` attribute.
-
- ```cshtml
-
-
-
- @functions {
- IList todos = new List();
-
- void AddTodo()
- {
- // Todo: Add the todo
- }
- }
- ```
-
- The `AddTodo` C# method is called every time the button is selected.
-
-1. To get the title of the new todo item, add a `newTodo` string field and bind it to the value of the text input using the `bind` attribute.
-
- ```csharp
- IList todos = new List();
- string newTodo;
- ```
-
- ```cshtml
-
- ```
-
-1. Update the `AddTodo` method to add the `TodoItem` with the specified title to the list. Don't forget to clear the value of the text input by setting `newTodo` to an empty string.
-
- ```cshtml
- @page "/todo"
-
-
Todo
-
-
- @foreach (var todo in todos)
- {
-
@todo.Title
- }
-
-
-
-
-
- @functions {
- IList todos = new List();
- string newTodo;
-
- void AddTodo()
- {
- if (!string.IsNullOrWhiteSpace(newTodo))
- {
- todos.Add(new TodoItem { Title = newTodo });
- newTodo = string.Empty;
- }
- }
- }
- ```
-
-1. Refresh the browser. Add some todos to the todo list.
-
- 
-
-1. Lastly, what's a todo list without check boxes? The title text for each todo item can be made editable as well. Add a check box input and text input for each todo item and bind their values to the `Title` and `IsDone` properties, respectively.
-
- ```cshtml
-
- @foreach (var todo in todos)
- {
-
-
-
-
- }
-
- ```
-
-1. To verify that these values are bound, update the `h1` header to show a count of the number of todo items that are not yet done (`IsDone` is `false`).
-
- ```cshtml
-
Todo (@todos.Count(todo => !todo.IsDone))
- ```
-
-1. The completed `Todo` component should look like this:
-
- ```cshtml
- @page "/todo"
-
-
Todo (@todos.Count(todo => !todo.IsDone))
-
-
- @foreach (var todo in todos)
- {
-
-
-
-
- }
-
-
-
-
-
- @functions {
- IList todos = new List();
- string newTodo;
-
- void AddTodo()
- {
- if (!string.IsNullOrWhiteSpace(newTodo))
- {
- todos.Add(new TodoItem { Title = newTodo });
- newTodo = string.Empty;
- }
- }
- }
- ```
-
-Refresh the app in the browser. Try adding some todo items.
-
-
-
-## Publish and deploy
-
-When using Visual Studio, perform the following steps to publish the Todo Blazor app to Azure:
-
-1. Right-click on the project in **Solution Explorer** and select **Publish**.
-
-1. In the **Pick a publish target** dialog, select **App Service** and **Create New**. Select **Publish**.
-
- 
-
-1. In the **Create App Service** dialog, choose a name for the app and select the subscription, resource group, and hosting plan. Select **Create** to create the app service and publish the app.
-
- 
-
-Wait a minute or so for the app to be deployed.
-
-The app should now be running in Azure. Mark the todo item to build your first Blazor app as *done*. Nice job!
-
-
-
-> [!NOTE]
-> If not using Visual Studio, publish the Blazor app at a command prompt on Windows, macOS, or Linux:
->
-> ```console
-> dotnet publish -c Release
-> ```
->
-> The deployment is created in the */bin/Release/\/publish* folder. Move the contents of the *publish* folder to the server or hosting service.
->
-> For more information, see the [Host and deploy](xref:host-and-deploy/razor-components/index#publish-the-app) topic.
-
-## Additional resources
-
-For a more involved Blazor sample app, check out the [Flight Finder sample](https://github.com/aspnet/samples/tree/master/samples/aspnetcore/blazor) on GitHub.
-
-
diff --git a/aspnetcore/tutorials/build-your-first-blazor-app/_static/blazor-publish-create-appservice2.png b/aspnetcore/tutorials/build-your-first-blazor-app/_static/blazor-publish-create-appservice2.png
deleted file mode 100644
index 9eacf3920aeb..000000000000
Binary files a/aspnetcore/tutorials/build-your-first-blazor-app/_static/blazor-publish-create-appservice2.png and /dev/null differ
diff --git a/aspnetcore/tutorials/build-your-first-blazor-app/_static/blazor-publish-pick-target.png b/aspnetcore/tutorials/build-your-first-blazor-app/_static/blazor-publish-pick-target.png
deleted file mode 100644
index 7b59c3bb0734..000000000000
Binary files a/aspnetcore/tutorials/build-your-first-blazor-app/_static/blazor-publish-pick-target.png and /dev/null differ
diff --git a/aspnetcore/tutorials/build-your-first-blazor-app/_static/new-aspnet-core-project.png b/aspnetcore/tutorials/build-your-first-blazor-app/_static/new-aspnet-core-project.png
deleted file mode 100644
index bcc5ceb05db6..000000000000
Binary files a/aspnetcore/tutorials/build-your-first-blazor-app/_static/new-aspnet-core-project.png and /dev/null differ
diff --git a/aspnetcore/tutorials/build-your-first-blazor-app/_static/new-blazor-app-dialog.png b/aspnetcore/tutorials/build-your-first-blazor-app/_static/new-blazor-app-dialog.png
deleted file mode 100644
index a3af5627366e..000000000000
Binary files a/aspnetcore/tutorials/build-your-first-blazor-app/_static/new-blazor-app-dialog.png and /dev/null differ
diff --git a/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/App.cshtml b/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/App.cshtml
deleted file mode 100644
index 59be8326e130..000000000000
--- a/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/App.cshtml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
diff --git a/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/BlazorApp1.csproj b/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/BlazorApp1.csproj
deleted file mode 100644
index 0ea04e852c73..000000000000
--- a/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/BlazorApp1.csproj
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
- netstandard2.0
- dotnet
- blazor serve
- 7.3
-
-
-
-
-
-
-
-
-
diff --git a/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/Program.cs b/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/Program.cs
deleted file mode 100644
index 83d1632be74e..000000000000
--- a/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/Program.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using Microsoft.AspNetCore.Blazor.Hosting;
-
-namespace BlazorApp1
-{
- public class Program
- {
- public static void Main(string[] args)
- {
- CreateHostBuilder(args).Build().Run();
- }
-
- public static IWebAssemblyHostBuilder CreateHostBuilder(string[] args) =>
- BlazorWebAssemblyHost.CreateDefaultBuilder()
- .UseBlazorStartup();
- }
-}
diff --git a/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/README.md b/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/README.md
deleted file mode 100644
index 96223bd47226..000000000000
--- a/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Build Your First Blazor App Sample (BlazorApp1)
-
-This sample illustrates the basic features of the Blazor app development framework.
diff --git a/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/Shared/SurveyPrompt.cshtml b/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/Shared/SurveyPrompt.cshtml
deleted file mode 100644
index 3bb6f5dbbb11..000000000000
--- a/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/Shared/SurveyPrompt.cshtml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
- @Title
-
-
- Please take our
-
- brief survey
-
-
- and tell us what you think.
-
-
-@functions {
- [Parameter]
- string Title { get; set; } // Demonstrates how a parent component can supply parameters
-}
diff --git a/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/Startup.cs b/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/Startup.cs
deleted file mode 100644
index 2950a463c031..000000000000
--- a/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/Startup.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using Microsoft.AspNetCore.Blazor.Builder;
-using Microsoft.Extensions.DependencyInjection;
-
-namespace BlazorApp1
-{
- public class Startup
- {
- public void ConfigureServices(IServiceCollection services)
- {
- }
-
- public void Configure(IBlazorApplicationBuilder app)
- {
- app.AddComponent("app");
- }
- }
-}
diff --git a/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/_ViewImports.cshtml b/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/_ViewImports.cshtml
deleted file mode 100644
index b9ed0711135e..000000000000
--- a/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/_ViewImports.cshtml
+++ /dev/null
@@ -1,6 +0,0 @@
-@using System.Net.Http
-@using Microsoft.AspNetCore.Blazor.Layouts
-@using Microsoft.AspNetCore.Blazor.Routing
-@using Microsoft.JSInterop
-@using BlazorApp1
-@using BlazorApp1.Shared
diff --git a/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/wwwroot/sample-data/weather.json b/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/wwwroot/sample-data/weather.json
deleted file mode 100644
index ab28bc13ac18..000000000000
--- a/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/wwwroot/sample-data/weather.json
+++ /dev/null
@@ -1,32 +0,0 @@
-[
- {
- "date": "2018-05-06",
- "temperatureC": 1,
- "summary": "Freezing",
- "temperatureF": 33
- },
- {
- "date": "2018-05-07",
- "temperatureC": 14,
- "summary": "Bracing",
- "temperatureF": 57
- },
- {
- "date": "2018-05-08",
- "temperatureC": -13,
- "summary": "Freezing",
- "temperatureF": 9
- },
- {
- "date": "2018-05-09",
- "temperatureC": -16,
- "summary": "Balmy",
- "temperatureF": 4
- },
- {
- "date": "2018-05-10",
- "temperatureC": -2,
- "summary": "Chilly",
- "temperatureF": 29
- }
-]
diff --git a/aspnetcore/tutorials/build-your-first-razor-components-app.md b/aspnetcore/tutorials/build-your-first-razor-components-app.md
new file mode 100644
index 000000000000..767471b0d2b8
--- /dev/null
+++ b/aspnetcore/tutorials/build-your-first-razor-components-app.md
@@ -0,0 +1,199 @@
+---
+title: Build your first Razor Components app
+author: guardrex
+description: Build a Razor Components app step-by-step and learn basic Razor Components framework concepts.
+monikerRange: '>= aspnetcore-3.0'
+ms.author: riande
+ms.custom: mvc
+ms.date: 02/04/2019
+uid: tutorials/first-razor-components-app
+---
+# Build your first Razor Components app
+
+By [Daniel Roth](https://github.com/danroth27) and [Luke Latham](https://github.com/guardrex)
+
+[!INCLUDE[](~/includes/razor-components-preview-notice.md)]
+
+This tutorial shows you how to build a Razor Components app and demonstrates basic Razor Components framework concepts.
+
+[View or download sample code](https://github.com/aspnet/Docs/tree/master/aspnetcore/tutorials/build-your-first-razor-components-app/samples/) ([how to download](xref:index#how-to-download-a-sample)). See the [Get started](xref:razor-components/get-started) topic for prerequisites.
+
+## Create an app from the Razor Components template
+
+Follow the guidance in the [Get started](xref:razor-components/get-started) topic to create a Razor Components project from the Razor Components template. Name the solution *WebApplication1*. You can use Visual Studio or a command shell with .NET Core CLI commands.
+
+## Build components
+
+1. Browse to each of the app's three pages: Home, Counter, and Fetch data. These pages are implemented by Razor files in the *WebApplication1.App/Pages* folder: *Index.cshtml*, *Counter.cshtml*, and *FetchData.cshtml*.
+
+1. On the Counter page, select the **Click me** button to increment the counter without a page refresh. Incrementing a counter in a webpage normally requires writing JavaScript, but Razor Components provides a better approach using C#.
+
+1. Examine the implementation of the Counter component in the *Counter.cshtml* file.
+
+ *WebApplication1.App/Pages/Counter.cshtml*:
+
+ [!code-cshtml[](build-your-first-razor-components-app/samples_snapshot/3.x/Counter1.cshtml)]
+
+ The UI of the Counter component is defined using HTML. Dynamic rendering logic (for example, loops, conditionals, expressions) is added using an embedded C# syntax called [Razor](xref:mvc/views/razor). The HTML markup and C# rendering logic are converted into a component class at build time. The name of the generated .NET class matches the file name.
+
+ Members of the component class are defined in a `@functions` block. In the `@functions` block, component state (properties, fields) and methods are specified for event handling or for defining other component logic. These members are then used as part of the component's rendering logic and for handling events.
+
+ When the **Click me** button is selected:
+
+ * The Counter component's registered `onclick` handler is called (the `IncrementCount` method).
+ * The Counter component regenerates its render tree.
+ * The new render tree is compared to the previous one.
+ * Only modifications to the Document Object Model (DOM) are applied. The displayed count is updated.
+
+1. Modify the C# logic of the Counter component to make the count increment by two instead of one.
+
+ [!code-cshtml[](build-your-first-razor-components-app/samples_snapshot/3.x/Counter2.cshtml?highlight=14)]
+
+1. Rebuild and run the app to see the changes. Select the **Click me** button, and the counter increments by two.
+
+## Use components
+
+Include a component into another component using an HTML-like syntax.
+
+1. Add the Counter component to the app's Index (home page) component by adding a `` element to the Index component.
+
+ *WebApplication1.App/Pages/Index.cshtml*:
+
+ [!code-cshtml[](build-your-first-razor-components-app/samples_snapshot/3.x/Index.cshtml?highlight=7)]
+
+1. Rebuild and run the app. The home page has its own counter.
+
+## Component parameters
+
+Components can also have parameters. Component parameters are defined using non-public properties on the component class decorated with `[Parameter]`. Use attributes to specify arguments for a component in markup.
+
+1. Update the component's `@functions` C# code:
+
+ * Add a `IncrementAmount` property decorated with the `[Parameter]` attribute.
+ * Change the `IncrementCount` method to use the `IncrementAmount` when increasing the value of `currentCount`.
+
+ *WebApplication1.App/Pages/Counter.cshtml*:
+
+ [!code-cshtml[](build-your-first-razor-components-app/samples/3.x/WebApplication1/WebApplication1.App/Pages/Counter.cshtml?highlight=12,16)]
+
+
+
+1. Specify an `IncrementAmount` parameter in the Home component's `` element using an attribute. Set the value to increment the counter by ten.
+
+ *WebApplication1.App/Pages/Index.cshtml*:
+
+ [!code-cshtml[](build-your-first-razor-components-app/samples/3.x/WebApplication1/WebApplication1.App/Pages/Index.cshtml?highlight=7)]
+
+1. Reload the page. The home page counter increments by ten each time the **Click me** button is selected. The counter on the *Counter* page increments by one.
+
+## Route to components
+
+The `@page` directive at the top of the *Counter.cshtml* file specifies that this component is a routing endpoint. The Counter component handles requests sent to `/Counter`. Without the `@page` directive, the component doesn't handle routed requests, but the component can still be used by other components.
+
+## Dependency injection
+
+Services registered in the app's service container are available to components via [dependency injection (DI)](xref:fundamentals/dependency-injection). Inject services into a component using the `@inject` directive.
+
+Examine the directives of the FetchData component (*WebApplication1.App/Pages/FetchData.cshtml*). The `@inject` directive is used to inject the instance of the `WeatherForecastService` service into the component:
+
+[!code-cshtml[](build-your-first-razor-components-app/samples_snapshot/3.x/FetchData1.cshtml?highlight=3)]
+
+The `WeatherForecastService` service is registered as a [singleton](xref:fundamentals/dependency-injection#service-lifetimes), so one instance of the service is available throughout the app.
+
+The FetchData component uses the injected service, as `ForecastService`, to retrieve an array of `WeatherForecast` objects:
+
+[!code-cshtml[](build-your-first-razor-components-app/samples_snapshot/3.x/FetchData2.cshtml?highlight=6)]
+
+A [@foreach](/dotnet/csharp/language-reference/keywords/foreach-in) loop is used to render each forecast instance as a row in the table of weather data:
+
+[!code-cshtml[](build-your-first-razor-components-app/samples_snapshot/3.x/FetchData3.cshtml?highlight=11-19)]
+
+## Build a todo list
+
+Add a new page to the app that implements a simple todo list.
+
+1. Add an empty file to the *WebApplication1.App/Pages* folder named *Todo.cshtml*.
+
+1. Provide the initial markup for the page:
+
+ ```cshtml
+ @page "/todo"
+
+
Todo
+ ```
+
+1. Add the Todo page to the navigation bar.
+
+ The NavMenu component (*WebApplication1/Shared/NavMenu.csthml*) is used in the app's layout. Layouts are components that allow you to avoid duplication of content in the app. For more information, see .
+
+ Add a `` for the Todo page by adding the following list item markup below the existing list items in the *WebApplication1/Shared/NavMenu.csthml* file:
+
+ ```cshtml
+
+
+ Todo
+
+
+ ```
+
+1. Rebuild and run the app. Visit the new Todo page to confirm that the link to the Todo page works.
+
+1. Add a *TodoItem.cs* file to the root of the project to hold a class that represents a todo item. Use the following C# code for the `TodoItem` class:
+
+ [!code-cshtml[](build-your-first-razor-components-app/samples/3.x/WebApplication1/WebApplication1.App/TodoItem.cs)]
+
+1. Return to the Todo component (*Todo.cshtml*):
+
+ * Add a field for the todos in an `@functions` block. The Todo component uses this field to maintain the state of the todo list.
+ * Add unordered list markup and a `foreach` loop to render each todo item as a list item.
+
+ [!code-cshtml[](build-your-first-razor-components-app/samples_snapshot/3.x/FetchData4.cshtml?highlight=5-10,12-14)]
+
+1. The app requires UI elements for adding todos to the list. Add a text input and a button below the list:
+
+ [!code-cshtml[](build-your-first-razor-components-app/samples_snapshot/3.x/FetchData5.cshtml?highlight=12-13)]
+
+1. Rebuild and run the app. When the **Add todo** button is selected, nothing happens because an event handler isn't wired up to the button.
+
+1. Add an `AddTodo` method to the Todo component and register it for button clicks using the `onclick` attribute:
+
+ [!code-cshtml[](build-your-first-razor-components-app/samples_snapshot/3.x/FetchData6.cshtml?highlight=2,7-10)]
+
+ The `AddTodo` C# method is called when the button is selected.
+
+1. To get the title of the new todo item, add a `newTodo` string field and bind it to the value of the text input using the `bind` attribute:
+
+ [!code-cshtml[](build-your-first-razor-components-app/samples_snapshot/3.x/FetchData7.cshtml?highlight=2)]
+
+ ```cshtml
+
+ ```
+
+1. Update the `AddTodo` method to add the `TodoItem` with the specified title to the list. Clear the value of the text input by setting `newTodo` to an empty string:
+
+ [!code-cshtml[](build-your-first-razor-components-app/samples_snapshot/3.x/FetchData8.cshtml?highlight=19-26)]
+
+1. Rebuild and run the app. Add some todos to the todo list to test the new code.
+
+1. The title text for each todo item can be made editable and a check box can help the user keep track of completed items. Add a check box input for each todo item and bind its value to the `IsDone` property. Change `@todo.Title` to an `` element bound to `@todo.Title`:
+
+ [!code-cshtml[](build-your-first-razor-components-app/samples_snapshot/3.x/FetchData9.cshtml?highlight=5-6)]
+
+1. To verify that these values are bound, update the `
` header to show a count of the number of todo items that aren't complete (`IsDone` is `false`).
+
+ ```cshtml
+
Todo (@todos.Count(todo => !todo.IsDone))
+ ```
+
+1. The completed Todo component (*Todo.cshtml*):
+
+ [!code-cshtml[](build-your-first-razor-components-app/samples/3.x/WebApplication1/WebApplication1.App/Pages/Todo.cshtml)]
+
+1. Rebuild and run the app. Add todo items to test the new code.
+
+## Publish and deploy the app
+
+To publish the app, see .
diff --git a/aspnetcore/tutorials/build-your-first-razor-components-app/samples/3.x/WebApplication1/README.md b/aspnetcore/tutorials/build-your-first-razor-components-app/samples/3.x/WebApplication1/README.md
new file mode 100644
index 000000000000..a11082f13b67
--- /dev/null
+++ b/aspnetcore/tutorials/build-your-first-razor-components-app/samples/3.x/WebApplication1/README.md
@@ -0,0 +1,3 @@
+# Build Your First Razor Components App Sample (WebApplication1)
+
+This sample illustrates the basic scenarios of the Razor Components framework.
diff --git a/aspnetcore/tutorials/build-your-first-razor-components-app/samples/3.x/WebApplication1/WebApplication1.App/App.cshtml b/aspnetcore/tutorials/build-your-first-razor-components-app/samples/3.x/WebApplication1/WebApplication1.App/App.cshtml
new file mode 100644
index 000000000000..03eee81ceff2
--- /dev/null
+++ b/aspnetcore/tutorials/build-your-first-razor-components-app/samples/3.x/WebApplication1/WebApplication1.App/App.cshtml
@@ -0,0 +1,5 @@
+@*
+ The Router component displays whichever component has a @page
+ directive matching the current URI.
+*@
+
diff --git a/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/Pages/Counter.cshtml b/aspnetcore/tutorials/build-your-first-razor-components-app/samples/3.x/WebApplication1/WebApplication1.App/Pages/Counter.cshtml
similarity index 61%
rename from aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/Pages/Counter.cshtml
rename to aspnetcore/tutorials/build-your-first-razor-components-app/samples/3.x/WebApplication1/WebApplication1.App/Pages/Counter.cshtml
index 887847471b4b..add04af3265d 100644
--- a/aspnetcore/tutorials/build-your-first-blazor-app/samples/3.x/BlazorApp1/Pages/Counter.cshtml
+++ b/aspnetcore/tutorials/build-your-first-razor-components-app/samples/3.x/WebApplication1/WebApplication1.App/Pages/Counter.cshtml
@@ -1,6 +1,6 @@
@page "/counter"
-