Add almost all of content
diff --git a/core/src/main/kotlin/Formats/JavaLayoutHtmlFormat.kt b/core/src/main/kotlin/Formats/JavaLayoutHtmlFormat.kt
index 67e6828..4a7f2d8 100644
--- a/core/src/main/kotlin/Formats/JavaLayoutHtmlFormat.kt
+++ b/core/src/main/kotlin/Formats/JavaLayoutHtmlFormat.kt
@@ -86,7 +86,7 @@
 
     val contentToHtmlBuilder = ContentToHtmlBuilder(uriProvider, uri)
 
-    private fun FlowContent.summaryNodeGroup(nodes: Iterable<DocumentationNode>, header: String, headerAsRow: Boolean = false, row: TBODY.(DocumentationNode) -> Unit) {
+    private fun <T> FlowContent.summaryNodeGroup(nodes: Iterable<T>, header: String, headerAsRow: Boolean = false, row: TBODY.(T) -> Unit) {
         if (nodes.none()) return
         if (!headerAsRow) {
             h2 { +header }
@@ -114,7 +114,7 @@
         td { metaMarkup(node.summary) }
     }
 
-    private fun TBODY.formatFunctionSummaryRow(node: DocumentationNode) = tr {
+    private fun TBODY.functionSummaryRow(node: DocumentationNode) = tr {
         td {
             for (modifier in node.details(NodeKind.Modifier)) {
                 renderedSignature(modifier, SUMMARY)
@@ -130,6 +130,21 @@
         }
     }
 
+    private fun TBODY.formatInheritRow(entry: Map.Entry<DocumentationNode, List<DocumentationNode>>) = tr {
+        td {
+            val (from, nodes) = entry
+            +"From class "
+            a(href = uriProvider.linkTo(from.owner!!, uri)) { +from.qualifiedName() }
+            table {
+                tbody {
+                    for (node in nodes) {
+                        functionSummaryRow(node)
+                    }
+                }
+            }
+        }
+    }
+
     private fun FlowContent.renderedSignature(node: DocumentationNode, mode: LanguageService.RenderMode = SUMMARY) {
         metaMarkup(languageService.render(node, mode))
     }
@@ -158,6 +173,10 @@
         }
     }
 
+    private fun FlowContent.fullPropertyDocs(node: DocumentationNode) {
+        fullFunctionDocs(node)
+    }
+
     fun appendPackage(node: DocumentationNode) = templateService.composePage(
             listOf(node),
             htmlConsumer,
@@ -173,13 +192,12 @@
                 summaryNodeGroup(node.members(NodeKind.AnnotationClass), "Annotations") { formatClassLikeRow(it) }
                 summaryNodeGroup(node.members(NodeKind.Enum), "Enums") { formatClassLikeRow(it) }
 
-                summaryNodeGroup(node.members(NodeKind.Function), "Top-level functions summary") { formatFunctionSummaryRow(it) }
+                summaryNodeGroup(node.members(NodeKind.Function), "Top-level functions summary") { functionSummaryRow(it) }
+                summaryNodeGroup(node.members(NodeKind.Property), "Top-level properties summary") { functionSummaryRow(it) }
 
 
-                h2 { +"Top-level functions" }
-                for (function in node.members(NodeKind.Function)) {
-                    fullFunctionDocs(function)
-                }
+                fullDocs(node.members(NodeKind.Function), { h2 { +"Top-level functions" } }) { fullFunctionDocs(it) }
+                fullDocs(node.members(NodeKind.Property), { h2 { +"Top-level properties" } }) { fullPropertyDocs(it) }
             }
     )
 
@@ -196,15 +214,46 @@
                 metaMarkup(node.content)
 
                 h2 { +"Summary" }
-                val functionsToDisplay = node.members(NodeKind.Function) + node.members(NodeKind.CompanionObjectFunction)
-                summaryNodeGroup(functionsToDisplay, "Functions", headerAsRow = true) { formatFunctionSummaryRow(it) }
 
-                h2 { +"Functions" }
-                for (function in functionsToDisplay) {
-                    fullFunctionDocs(function)
-                }
+                fun DocumentationNode.isFunction() = kind == NodeKind.Function || kind == NodeKind.CompanionObjectFunction
+                fun DocumentationNode.isProperty() = kind == NodeKind.Property || kind == NodeKind.CompanionObjectProperty
+
+                val functionsToDisplay = node.members.filter(DocumentationNode::isFunction)
+                val properties = node.members.filter(DocumentationNode::isProperty)
+                val inheritedFunctionsByReceiver = node.inheritedMembers.filter(DocumentationNode::isFunction).groupBy { it.owner!! }
+                val inheritedPropertiesByReceiver = node.inheritedMembers.filter(DocumentationNode::isProperty).groupBy { it.owner!! }
+                val extensionProperties = node.extensions.filter(DocumentationNode::isProperty)
+                val extensionFunctions = node.extensions.filter(DocumentationNode::isFunction)
+
+
+                summaryNodeGroup(functionsToDisplay, "Functions", headerAsRow = true) { functionSummaryRow(it) }
+                summaryNodeGroup(inheritedFunctionsByReceiver.entries, "Inherited functions", headerAsRow = true) { formatInheritRow(it) }
+                summaryNodeGroup(extensionFunctions, "Extension functions", headerAsRow = true) { functionSummaryRow(it) }
+
+
+                summaryNodeGroup(properties, "Properties", headerAsRow = true) { functionSummaryRow(it) }
+                summaryNodeGroup(inheritedPropertiesByReceiver.entries, "Inherited properties", headerAsRow = true) { formatInheritRow(it) }
+                summaryNodeGroup(extensionProperties, "Extension properties", headerAsRow = true) { functionSummaryRow(it) }
+
+
+                fullDocs(functionsToDisplay, { h2 { +"Functions" } }) { fullFunctionDocs(it) }
+                fullDocs(extensionFunctions, { h2 { +"Extension functions" } }) { fullFunctionDocs(it) }
+                fullDocs(properties, { h2 { +"Properties" } }) { fullPropertyDocs(it) }
+                fullDocs(extensionProperties, { h2 { +"Extension properties" } }) { fullPropertyDocs(it) }
             }
     )
+
+    private fun FlowContent.fullDocs(
+            nodes: List<DocumentationNode>,
+            header: FlowContent.() -> Unit,
+            renderNode: FlowContent.(DocumentationNode) -> Unit
+    ) {
+        if (nodes.none()) return
+        header()
+        for (node in nodes) {
+            renderNode(node)
+        }
+    }
 }
 
 class ContentToHtmlBuilder(val uriProvider: JavaLayoutHtmlUriProvider, val uri: URI) {
@@ -294,7 +343,8 @@
         val logger: DokkaLogger
 ) : Generator, JavaLayoutHtmlUriProvider {
 
-    @set:Inject(optional = true) var outlineFactoryService: JavaLayoutHtmlFormatOutlineFactoryService? = null
+    @set:Inject(optional = true)
+    var outlineFactoryService: JavaLayoutHtmlFormatOutlineFactoryService? = null
 
     fun createOutputBuilderForNode(node: DocumentationNode, output: Appendable)
             = JavaLayoutHtmlFormatOutputBuilder(output, languageService, this, templateService, mainUri(node))