diff --git a/pages/en/lb4/Controller-generator.md b/pages/en/lb4/Controller-generator.md
index be32861a3..ff9d44f3d 100644
--- a/pages/en/lb4/Controller-generator.md
+++ b/pages/en/lb4/Controller-generator.md
@@ -31,8 +31,98 @@ If provided, the tool will use that as the default when it prompts for the name.
The tool will prompt you for:
-- Name of the controller. If the name had been supplied from the command line, the prompt is skipped and the controller is built with the name from the command-line argument.
+- Name of the controller. If the name had been supplied from the command line,
+the prompt is skipped and the controller is built with the name from the
+command-line argument.
+- Type of the controller. You can select from the following types:
+ * **Empty Controller** - An empty controller definition
+ * **Basic CRUD Controller** - A controller wired up to a model and repository
+ definition, with pre-defined CRUD methods.
-### Output
+#### Empty Controller
+If you select the Empty Controller, it will generate a nearly-empty template
+based on the given name:
-The tool will create a new file as /src/controllers/controller-name.controller.ts. The file will contain an empty constructor and common package imports that can be uncommented.
+```ts
+// Uncomment these imports to begin using these cool features!
+
+// import {inject} from '@loopback/context';
+
+export class FooController {
+ constructor() {}
+}
+```
+
+#### REST Controller with CRUD Methods
+If you select the REST Controller with CRUD Methods type, you will then be asked
+to select:
+- The model to use for the CRUD function definitions
+- The repository for this model that provides datasource connectivity
+
+{% include warning.html content=
+"
+If you do not have a model and repository to select, then you will
+receive an error!
+" lang=page.lang %}
+
+Here's an example of what the template will produce given a `Todo` model and
+a `TodoRepository`:
+```ts
+import {Filter, Where} from '@loopback/repository';
+import {post, param, get, put, patch, del} from '@loopback/openapi-v2';
+import {inject} from '@loopback/context';
+import {Todo} from '../models';
+import {TodoRepository} from '../repositories';
+
+export class TodoController {
+
+ constructor(
+ @inject('repositories.TodoRepository')
+ public todoRepository : TodoRepository,
+ ) {}
+
+ @post('/todo')
+ async create(@param.body('obj') obj: Todo)
+ : Promise {
+ return await this.todoRepository.create(obj);
+ }
+
+ @get('/todo/count')
+ async count(@param.query.string('where') where: Where) : Promise {
+ return await this.todoRepository.count(where);
+ }
+
+ @get('/todo')
+ async find(@param.query.string('filter') filter: Filter)
+ : Promise {
+ return await this.todoRepository.find(filter);
+ }
+
+ @patch('/todo')
+ async updateAll(@param.query.string('where') where: Where,
+ @param.body('obj') obj: Todo) : Promise {
+ return await this.todoRepository.updateAll(where, obj);
+ }
+
+ @del('/todo')
+ async deleteAll(@param.query.string('where') where: Where) : Promise {
+ return await this.todoRepository.deleteAll(where);
+ }
+
+ @get('/todo/{id}')
+ async findById(@param.path.number('id') id: number) : Promise {
+ return await this.todoRepository.findById(id);
+ }
+
+ @patch('/todo/{id}')
+ async updateById(@param.path.number('id') id: number, @param.body('obj')
+ obj: Todo) : Promise {
+ return await this.todoRepository.updateById(id, obj);
+ }
+
+ @del('/todo/{id}')
+ async deleteById(@param.path.number('id') id: number) : Promise {
+ return await this.todoRepository.deleteById(id);
+ }
+}
+```