diff --git a/docs/extensions/advanced.md b/docs/extensions/advanced.md
new file mode 100644
index 0000000000000000000000000000000000000000..e6cc5ec0f3387a05794e5d3140d9ed23555eb225
--- /dev/null
+++ b/docs/extensions/advanced.md
@@ -0,0 +1,83 @@
+# Advanced patterns
+
+[]( FIXME remove this banner after review)
+>> NOTE: Some of these instruction maybe deprecated and superceded by better
+>> approaches.
+
+## Web Services
+
+There are three options to create an ajax or web-service callback:
+
+-   **Full control:**Add a basic page. Remove the parent::run() call
+    from the run() function, and at the bottom of the run() function,
+    perform your own output (eg "*echo json\_encode($data)*") and then
+    short-circuit processing (eg "*CRM\_Utils\_System::civiExit()*") so
+    that neither Smarty nor the CMS modify the output.
+-   **Using ajax helpers (CiviCRM 4.5 and above**): Generate a page with
+    civix as above. Build your data in the run() function. If the
+    client-side request includes *snippet=json* in the url, just append
+    your data to *$this-\>ajaxResponse* array and the rest will happen
+    automatically. If not, you can directly call
+    CRM\_Core\_Page\_AJAX::returnJsonResponse() at the bottom of the run
+    function. See [Ajax Pages and
+    Forms](/confluence/display/CRMDOC/Ajax+Pages+and+Forms)
+    documentation.
+-   **Using the API:** Add an API function using `civix`.
+    The API function can be called with the API's [AJAX
+    Interface](http://wiki.civicrm.org/confluence/display/CRMDOC/AJAX+Interface).
+    This automatically handles issues like encoding and decoding the
+    request/response.
+
+## Standalone PHP scripts
+
+Instead of creating a standalone script, consider one of these options:
+
+-   Add an API function (using the instructions above). The API function
+    can be called many different ways – cv, PHP, REST, AJAX, CLI, Drush,
+    Smarty, cron, etc. CiviCRM used to include a number of standalone
+    scripts – many of these have been migrated to API functions because
+    this approach is simpler and more flexible.
+-   Add a basic page (using the instructions above). At the bottom of
+    the run() function, call "*CRM\_Utils\_System::civiExit()*" to
+    short-circuit theming and CMS processing.
+
+Creating a pure standalone PHP script is a tricky proposition and likely to be
+brittle compared with the above.
+
+If the script is truly standalone and
+does not require any services from the CRM or CMS, then you can just add a
+new `.php` file to the extension... but it won't have access to CiviCRM's
+APIs, databases, classes, etc. If the standalone script needs those
+services, then it will need to ***bootstrap*** CiviCRM and the CMS. This
+is challenging for several reasons:
+
+-   The bootstrap mechanics are different in each CMS (Drupal, Joomla,
+    etc).
+-   The bootstrap mechanics are different for single-site installations
+    and multi-site installations
+-   To initiate a bootstrap from a script, one needs to determine the
+    local-path to the CiviCRM settings. However, the local-path of the
+    script is entirely independent of the local-path to the settings –
+    these are determined at the discretion of the site administrator.
+
+If you really need to do it, it's theoretically possibly to emulate an
+example like
+"[bin/deprecated/EmailProcessor.php](http://svn.civicrm.org/civicrm/branches/v4.1/bin/deprecated/EmailProcessor.php)".
+The results will likely be difficult for downstream users to
+install/use.
+
+
+## Cron jobs
+
+One can add an API function (using the instructions above) and create a
+schedule record. In CiviCRM 4.3, the schedule record can be
+automatically created; to do this, call "civix
+[generate:api](http://generateapi)" with the option "–schedule Daily"
+(or "-schedule Hourly", etc). CiviCRM will make a best-effort to meet
+the stated schedule.
+
+In CiviCRM 4.2, one can use APIs as cron jobs, but the schedule record
+won't be created automatically. The site administrator must manually
+insert a scheduling record by navigating to "Administer =\> System
+Settings =\> Scheduled Jobs".
+
diff --git a/docs/extensions/civix.md b/docs/extensions/civix.md
index 128427d04221c7cf8a4583ca44e51a940eeb40b7..95f3a4a678f27d35bd3d8b774863262a8f4d3e6f 100644
--- a/docs/extensions/civix.md
+++ b/docs/extensions/civix.md
@@ -545,101 +545,3 @@ how to write a test class:
     PHPUnit.](https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html)
 -   Review the example code in
     [org.civicrm.exampletests](https://github.com/totten/org.civicrm.exampletests)
-
-# Frequently asked questions
-
-### How does one add an ajax/web-service callback?
-
-There are three options:
-
--   **Full control:**Add a basic page. Remove the parent::run() call
-    from the run() function, and at the bottom of the run() function,
-    perform your own output (eg "*echo json\_encode($data)*") and then
-    short-circuit processing (eg "*CRM\_Utils\_System::civiExit()*") so
-    that neither Smarty nor the CMS modify the output.
--   **Using ajax helpers (CiviCRM 4.5 and above**): Generate a page with
-    civix as above. Build your data in the run() function. If the
-    client-side request includes *snippet=json* in the url, just append
-    your data to *$this-\>ajaxResponse* array and the rest will happen
-    automatically. If not, you can directly call
-    CRM\_Core\_Page\_AJAX::returnJsonResponse() at the bottom of the run
-    function. See [Ajax Pages and
-    Forms](/confluence/display/CRMDOC/Ajax+Pages+and+Forms)
-    documentation.
--   **Using the API:** Add an API function using the instructions above.
-    The API function can be called with the API's [AJAX
-    Interface](http://wiki.civicrm.org/confluence/display/CRMDOC/AJAX+Interface).
-    This automatically handles issues like encoding and decoding the
-    request/response.
-
-### How does one add a standalone PHP script?
-
-This is tricky proposition. If the script is truly standalone and
-doesn't require any services from the CRM/CMS, then you can just add a
-new .php file to the extension... but it won't have access to CiviCRM's
-APIs, databases, classes, etc. If the standalone script needs those
-services, then it will need to ***bootstrap*** CiviCRM and the CMS. This
-is challenging for several reasons:
-
--   The bootstrap mechanics are different in each CMS (Drupal, Joomla,
-    etc).
--   The bootstrap mechanics are different for single-site installations
-    and multi-site installations
--   To initiate a bootstrap from a script, one needs to determine the
-    local-path to the CiviCRM settings. However, the local-path of the
-    script is entirely independent of the local-path to the settings –
-    these are determined at the discretion of the site administrator.
-
-If you really need to do it, it's theoretically possibly to emulate an
-example like
-"[bin/deprecated/EmailProcessor.php](http://svn.civicrm.org/civicrm/branches/v4.1/bin/deprecated/EmailProcessor.php)".
-The results will likely be difficult for downstream users to
-install/use.
-
-Instead of creating a standalone script, consider one of these options:
-
--   Add an API function (using the instructions above). The API function
-    can be called many different ways – PHP, REST, AJAX, CLI, Drush,
-    Smarty, cron, etc. CiviCRM used to include a number of standalone
-    scripts – many of these have been migrated to API functions because
-    this approach is simpler and more flexible.
--   Add a basic page (using the instructions above). At the bottom of
-    the run() function, call "*CRM\_Utils\_System::civiExit()*" to
-    short-circuit theming and CMS processing.
-
-### How does one add a cron job?
-
-One can add an API function (using the instructions above) and create a
-schedule record. In CiviCRM 4.3, the schedule record can be
-automatically created; to do this, call "civix
-[generate:api](http://generateapi)" with the option "–schedule Daily"
-(or "-schedule Hourly", etc). CiviCRM will make a best-effort to meet
-the stated schedule.
-
-In CiviCRM 4.2, one can use APIs as cron jobs, but the schedule record
-won't be created automatically. The site administrator must manually
-insert a scheduling record by navigating to "Administer =\> System
-Settings =\> Scheduled Jobs".
-
-# Troubleshooting
-
-1.  I've created the files and edited them but I don't see the expected
-    changes.\
-     A: Did you install and enable your extension?
-    (<site\>/civicrm/admin/extensions?reset=1)\
-     \
-
-2.  I get Error: "Cannot instantiate API client -- please set connection
-    options in parameters.yml"\
-     A: You might have missed the step about setting
-    'civicrm\_api3\_conf\_path'
-    ([https://github.com/totten/civix/](https://github.com/totten/civix/)),
-    or it didn't get set properly for some reason.\
-     \
-3.  I've tried to generate a page/report/search/upgrader/etc but it's
-    not working.\
-     A: For all of the various types, you must first run
-    [generate:module](http://generatemodule), and then \`cd\` into the
-    folder (e.g. com.example.myextension) before running one of the
-    other \`generate:\` commands.
-
diff --git a/docs/extensions/troubleshooting.md b/docs/extensions/troubleshooting.md
new file mode 100644
index 0000000000000000000000000000000000000000..ec4cf4a7b6ff9e1d8d8fe146d6d0e743d63eec18
--- /dev/null
+++ b/docs/extensions/troubleshooting.md
@@ -0,0 +1,42 @@
+# Troubleshooting
+
+If you are struggling, the best thing to do is reach out to the
+[CiviCRM community](../basics/community).
+
+If you cannot find the answer in this guide or by searching in the
+[CiviCRM StackExchange site](http://civicrm.stackexchange.com/)
+then please [ask](http://civicrm.stackexchange.com/questions/ask). Asking
+questions on StackExchange not only helps you but may well help others who
+follow you.
+
+That said, this is a small list of some of the commoner problems extension
+writers encounter.
+
+## Extension not doing anything
+
+[]( ###### arguably this list should be removed altogether?? #### )
+
+Q: I've created the files and edited them but I don't see the expected
+changes.
+
+A: Did you install and enable your extension?
+(<site\>/civicrm/admin/extensions?reset=1)
+
+## Civix error messages
+
+Q: I get Error: "Cannot instantiate API client -- please set connection
+options in parameters.yml"
+
+A: You might have missed the step about setting
+'civicrm\_api3\_conf\_path'
+([https://github.com/totten/civix/](https://github.com/totten/civix/)),
+or it didn't get set properly for some reason.
+
+Q: I've tried to generate a page/report/search/upgrader/etc with civix
+but it's not working.
+
+A: For all of the various types, you must first run
+[generate:module](http://generatemodule), and then \`cd\` into the
+folder (e.g. com.example.myextension) before running one of the
+other \`generate:\` commands.
+
diff --git a/mkdocs.yml b/mkdocs.yml
index 83a3dc142520047231e65b680fa7133f177f92ee..616a5fbfb444e7b2e06969810634a0a20f2ab8cc 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -25,8 +25,10 @@ pages:
    - All Available Hooks: hooks-db.md
 - Writing Extensions:
   - Basics: extensions/basics.md
-  - civix: extensions/civix.md
+  - Using civix: extensions/civix.md
   - Anatomy of Files: extensions/files.md
+  - Advanced Patterns: extensions/advanced.md
+  - Troubleshooting: extensions/troubleshooting.md
   # - Using hooks: extensions/using-hooks.md
   # - Customizing Screens: extensions/customize-screens.md
   # - Creating Pages: Forms/extensions/create-page.md