diff --git a/e2e/expandSchemas.html b/e2e/expandSchemas.html
new file mode 100644
index 0000000000..12ec60731e
--- /dev/null
+++ b/e2e/expandSchemas.html
@@ -0,0 +1,8 @@
+<html>
+
+<body>
+  <redoc spec-url="../demo/openapi.yaml" expand-schemas="true"></redoc>
+  <script src="../bundles/redoc.standalone.js"></script>
+</body>
+
+</html>
diff --git a/e2e/integration/expandSchemas.e2e.ts b/e2e/integration/expandSchemas.e2e.ts
new file mode 100644
index 0000000000..2267086812
--- /dev/null
+++ b/e2e/integration/expandSchemas.e2e.ts
@@ -0,0 +1,17 @@
+describe('Schemas', () => {
+  it('expandSchemas != true', () => {
+    cy.visit('e2e/standalone.html');
+
+    cy.get('.api-content')
+      .find('.expanded')
+      .should('have.length', 0);
+  });
+
+  it('expandSchemas == true', () => {
+    cy.visit('e2e/expandSchemas.html');
+
+    cy.get('.api-content')
+      .find('.expanded')
+      .should('have.length', 146);
+  });
+});
diff --git a/src/components/Responses/Response.tsx b/src/components/Responses/Response.tsx
index 58e0ae32e2..bc6ece8bd4 100644
--- a/src/components/Responses/Response.tsx
+++ b/src/components/Responses/Response.tsx
@@ -12,11 +12,12 @@ export class ResponseView extends React.Component<{ response: ResponseModel }> {
   };
 
   render() {
-    const { headers, type, summary, description, code, expanded, content } = this.props.response;
+    const { extensions, headers, type, summary, description, code, expanded, content } = this.props.response;
     const mimes =
       content === undefined ? [] : content.mediaTypes.filter(mime => mime.schema !== undefined);
 
-    const empty = headers.length === 0 && mimes.length === 0 && !description;
+    const empty = (!extensions || Object.keys(extensions).length === 0) &&
+      headers.length === 0 && mimes.length === 0 && !description;
 
     return (
       <div>
diff --git a/src/components/Responses/ResponseDetails.tsx b/src/components/Responses/ResponseDetails.tsx
index 821fc2da99..3794eba1da 100644
--- a/src/components/Responses/ResponseDetails.tsx
+++ b/src/components/Responses/ResponseDetails.tsx
@@ -7,15 +7,17 @@ import { DropdownOrLabel } from '../DropdownOrLabel/DropdownOrLabel';
 import { MediaTypesSwitch } from '../MediaTypeSwitch/MediaTypesSwitch';
 import { Schema } from '../Schema';
 
+import { Extensions } from '../Fields/Extensions';
 import { Markdown } from '../Markdown/Markdown';
 import { ResponseHeaders } from './ResponseHeaders';
 
 export class ResponseDetails extends React.PureComponent<{ response: ResponseModel }> {
   render() {
-    const { description, headers, content } = this.props.response;
+    const { description, extensions, headers, content } = this.props.response;
     return (
       <>
         {description && <Markdown source={description} />}
+        <Extensions extensions={extensions} />
         <ResponseHeaders headers={headers} />
         <MediaTypesSwitch content={content} renderDropdown={this.renderDropdown}>
           {({ schema }) => {
diff --git a/src/services/RedocNormalizedOptions.ts b/src/services/RedocNormalizedOptions.ts
index 58d4b8b068..7cbb089af8 100644
--- a/src/services/RedocNormalizedOptions.ts
+++ b/src/services/RedocNormalizedOptions.ts
@@ -41,6 +41,7 @@ export interface RedocRawOptions {
   expandDefaultServerVariables?: boolean;
   maxDisplayedEnumValues?: number;
   ignoreNamedSchemas?: string[] | string;
+  expandSchemas?: boolean;
   hideSchemaPattern?: boolean;
 }
 
@@ -87,6 +88,10 @@ export class RedocNormalizedOptions {
     return !!value;
   }
 
+  static normalizeExpandSchemas(value: RedocRawOptions['expandSchemas']): boolean {
+    return !!value;
+  }
+
   static normalizeScrollYOffset(value: RedocRawOptions['scrollYOffset']): () => number {
     // just number is not valid selector and leads to crash so checking if isNumeric here
     if (typeof value === 'string' && !isNumeric(value)) {
@@ -195,6 +200,7 @@ export class RedocNormalizedOptions {
   maxDisplayedEnumValues?: number;
 
   ignoreNamedSchemas: Set<string>;
+  expandSchemas: boolean;
   hideSchemaPattern: boolean;
 
   constructor(raw: RedocRawOptions, defaults: RedocRawOptions = {}) {
@@ -256,6 +262,7 @@ export class RedocNormalizedOptions {
       ? raw.ignoreNamedSchemas
       : raw.ignoreNamedSchemas?.split(',').map((s) => s.trim());
     this.ignoreNamedSchemas = new Set(ignoreNamedSchemas);
+    this.expandSchemas = RedocNormalizedOptions.normalizeExpandSchemas(raw.expandSchemas);
     this.hideSchemaPattern = argValueToBoolean(raw.hideSchemaPattern);
   }
 }
diff --git a/src/services/__tests__/fixtures/expandSchemas.json b/src/services/__tests__/fixtures/expandSchemas.json
new file mode 100644
index 0000000000..602d9f91b5
--- /dev/null
+++ b/src/services/__tests__/fixtures/expandSchemas.json
@@ -0,0 +1,20 @@
+{
+  "openapi": "3.0.0",
+  "info": {
+    "version": "1.0",
+    "title": "Foo"
+  },
+  "components": {
+    "schemas": {
+      "Foo": {
+        "type": "object",
+        "properties": {
+          "foo": {
+            "type": "string"
+          }
+        },
+        "additionalProperties": true
+      }
+    }
+  }
+}
diff --git a/src/services/__tests__/models/Response.test.ts b/src/services/__tests__/models/Response.test.ts
index 3fb220f2df..33cabb2c7e 100644
--- a/src/services/__tests__/models/Response.test.ts
+++ b/src/services/__tests__/models/Response.test.ts
@@ -31,5 +31,12 @@ describe('Models', () => {
       const resp = new ResponseModel(parser, 'default', true, {}, opts);
       expect(resp.type).toEqual('error');
     });
+
+    test('ensure extensions are shown if showExtensions is true', () => {
+      const options = new RedocNormalizedOptions({ showExtensions: true });
+      const resp = new ResponseModel(parser, 'default', true, { 'x-example': {a: 1} } as any, options);
+      expect(Object.keys(resp.extensions).length).toEqual(1);
+      expect(resp.extensions['x-example']).toEqual({a: 1});
+    });
   });
 });
diff --git a/src/services/__tests__/models/Schema.test.ts b/src/services/__tests__/models/Schema.test.ts
index 460ca7c110..2edf210b55 100644
--- a/src/services/__tests__/models/Schema.test.ts
+++ b/src/services/__tests__/models/Schema.test.ts
@@ -40,5 +40,25 @@ describe('Models', () => {
       expect(schema.oneOf).toHaveLength(2);
       expect(schema.displayType).toBe('(Array of strings or numbers) or string');
     });
+
+    test('expandSchemas != true', () => {
+      const spec = require('../fixtures/expandSchemas.json');
+      parser = new OpenAPIParser(spec, undefined, opts);
+      const schema = new SchemaModel(parser, spec.components.schemas.Foo, '', opts);
+      expect(schema.fields).toHaveLength(2);
+      expect(schema.fields![0].expanded).toEqual(false);
+      expect(schema.fields![1].expanded).toEqual(false);
+    });
+
+    test('expandSchemas == true', () => {
+      const opts = new RedocNormalizedOptions({ expandSchemas: true});
+
+      const spec = require('../fixtures/expandSchemas.json');
+      parser = new OpenAPIParser(spec, undefined, opts);
+      const schema = new SchemaModel(parser, spec.components.schemas.Foo, '', opts);
+      expect(schema.fields).toHaveLength(2);
+      expect(schema.fields![0].expanded).toEqual(true);
+      expect(schema.fields![1].expanded).toEqual(true);
+    });
   });
 });
diff --git a/src/services/models/Response.ts b/src/services/models/Response.ts
index f50ee0f1ca..629748ea54 100644
--- a/src/services/models/Response.ts
+++ b/src/services/models/Response.ts
@@ -2,7 +2,10 @@ import { action, observable, makeObservable } from 'mobx';
 
 import { OpenAPIResponse, Referenced } from '../../types';
 
-import { getStatusCodeType } from '../../utils';
+import {
+  extractExtensions,
+  getStatusCodeType,
+} from '../../utils';
 import { OpenAPIParser } from '../OpenAPIParser';
 import { RedocNormalizedOptions } from '../RedocNormalizedOptions';
 import { FieldModel } from './Field';
@@ -19,6 +22,8 @@ export class ResponseModel {
   type: string;
   headers: FieldModel[] = [];
 
+  extensions: Record<string, any>;
+
   constructor(
     parser: OpenAPIParser,
     code: string,
@@ -54,6 +59,10 @@ export class ResponseModel {
         return new FieldModel(parser, { ...header, name }, '', options);
       });
     }
+
+    if (options.showExtensions) {
+      this.extensions = extractExtensions(info, options.showExtensions);
+    }
   }
 
   @action
diff --git a/src/services/models/Schema.ts b/src/services/models/Schema.ts
index dd4a4d6f35..f765e9cfc1 100644
--- a/src/services/models/Schema.ts
+++ b/src/services/models/Schema.ts
@@ -348,7 +348,7 @@ function buildFields(
     const required =
       schema.required === undefined ? false : schema.required.indexOf(fieldName) > -1;
 
-    return new FieldModel(
+    const fieldModel = new FieldModel(
       parser,
       {
         name: fieldName,
@@ -361,6 +361,8 @@ function buildFields(
       $ref + '/properties/' + fieldName,
       options,
     );
+    fieldModel.expanded = options.expandSchemas;
+    return fieldModel;
   });
 
   if (options.sortPropsAlphabetically) {
@@ -372,22 +374,22 @@ function buildFields(
   }
 
   if (typeof additionalProps === 'object' || additionalProps === true) {
-    fields.push(
-      new FieldModel(
-        parser,
-        {
-          name: (typeof additionalProps === 'object'
-            ? additionalProps['x-additionalPropertiesName'] || 'property name'
-            : 'property name'
-          ).concat('*'),
-          required: false,
-          schema: additionalProps === true ? {} : additionalProps,
-          kind: 'additionalProperties',
-        },
-        $ref + '/additionalProperties',
-        options,
-      ),
+    const fieldModel = new FieldModel(
+      parser,
+      {
+        name: (typeof additionalProps === 'object'
+          ? additionalProps['x-additionalPropertiesName'] || 'property name'
+          : 'property name'
+        ).concat('*'),
+        required: false,
+        schema: additionalProps === true ? {} : additionalProps,
+        kind: 'additionalProperties',
+      },
+      $ref + '/additionalProperties',
+      options,
     );
+    fieldModel.expanded = options.expandSchemas;
+    fields.push(fieldModel);
   }
 
   return fields;
diff --git a/src/types/open-api.d.ts b/src/types/open-api.d.ts
index 7134890ea0..db67699f7c 100644
--- a/src/types/open-api.d.ts
+++ b/src/types/open-api.d.ts
@@ -182,7 +182,7 @@ export interface OpenAPIRequestBody {
 }
 
 export interface OpenAPIResponses {
-  [code: string]: OpenAPIResponse;
+  [code: string]: Referenced<OpenAPIResponse>;
 }
 
 export interface OpenAPIResponse {