diff --git a/assets/plugins/developing-plugins/dark-android.png b/assets/plugins/developing-plugins/dark-android.png
new file mode 100644
index 00000000..be80634a
Binary files /dev/null and b/assets/plugins/developing-plugins/dark-android.png differ
diff --git a/assets/plugins/developing-plugins/dark-ios.png b/assets/plugins/developing-plugins/dark-ios.png
new file mode 100644
index 00000000..e74839d3
Binary files /dev/null and b/assets/plugins/developing-plugins/dark-ios.png differ
diff --git a/assets/plugins/developing-plugins/ios-version-number.png b/assets/plugins/developing-plugins/ios-version-number.png
new file mode 100644
index 00000000..76752e25
Binary files /dev/null and b/assets/plugins/developing-plugins/ios-version-number.png differ
diff --git a/assets/plugins/developing-plugins/light-android.png b/assets/plugins/developing-plugins/light-android.png
new file mode 100644
index 00000000..1e64c8f8
Binary files /dev/null and b/assets/plugins/developing-plugins/light-android.png differ
diff --git a/assets/plugins/developing-plugins/light-ios.png b/assets/plugins/developing-plugins/light-ios.png
new file mode 100644
index 00000000..aed73786
Binary files /dev/null and b/assets/plugins/developing-plugins/light-ios.png differ
diff --git a/assets/plugins/developing-plugins/marketplace.png b/assets/plugins/developing-plugins/marketplace.png
new file mode 100644
index 00000000..47344078
Binary files /dev/null and b/assets/plugins/developing-plugins/marketplace.png differ
diff --git a/assets/plugins/developing-plugins/travis-ci.png b/assets/plugins/developing-plugins/travis-ci.png
new file mode 100644
index 00000000..cfc115a6
Binary files /dev/null and b/assets/plugins/developing-plugins/travis-ci.png differ
diff --git a/assets/plugins/developing-plugins/ui-plugin-ns-preview.png b/assets/plugins/developing-plugins/ui-plugin-ns-preview.png
new file mode 100644
index 00000000..4904d7dc
Binary files /dev/null and b/assets/plugins/developing-plugins/ui-plugin-ns-preview.png differ
diff --git a/assets/plugins/developing-plugins/vs-code-intellisense.png b/assets/plugins/developing-plugins/vs-code-intellisense.png
new file mode 100644
index 00000000..63e07cb7
Binary files /dev/null and b/assets/plugins/developing-plugins/vs-code-intellisense.png differ
diff --git a/assets/plugins/developing-plugins/working-ios-2.png b/assets/plugins/developing-plugins/working-ios-2.png
new file mode 100644
index 00000000..6488b7f2
Binary files /dev/null and b/assets/plugins/developing-plugins/working-ios-2.png differ
diff --git a/assets/plugins/developing-plugins/working-ios.png b/assets/plugins/developing-plugins/working-ios.png
new file mode 100644
index 00000000..19257170
Binary files /dev/null and b/assets/plugins/developing-plugins/working-ios.png differ
diff --git a/plugins/developing-plugins.md b/plugins/developing-plugins.md
index cd9dec2b..078fdebb 100644
--- a/plugins/developing-plugins.md
+++ b/plugins/developing-plugins.md
@@ -4,4 +4,2446 @@ title: Developing Plugins
Plugin development deserves it's own section as well!
-- https://github.com/NativeScript/docs/tree/master/docs/plugins
+- [REFERENCE] https://github.com/NativeScript/docs/tree/master/docs/plugins
+
+## Plugin Reference
+
+### What Are NativeScript Plugins
+
+A NativeScript plugin is any npm package, published or not, that exposes a native API via JavaScript and consists of the following elements.
+
+- A `package.json` file which contains the following metadata: name, version, supported runtime versions, dependencies and others.
+- One or more CommonJS modules that expose a native API via a unified JavaScript API. For more information about Common JS modules, see the [CommonJS Wiki](http://wiki.commonjs.org/wiki/CommonJS).
+- (Optional) Descriptions of permissions, features or other configurations required or used by your plugin inside a pre-compiled Android native library containing an `AndroidManifest.xml` or an `Info.plist` file for Android and iOS, respectively.
+- (Optional) Native Android libraries and the native Android `include.gradle` configuration file which describes the native dependencies.
+- (Optional) Native iOS libraries and the native `build.xcconfig` configuration file which describes the native dependencies.
+
+The plugin must have the directory structure, described in the [Directory Structure](#directory-structure) section.
+
+### Create a Plugin
+
+If the NativeScript framework does not expose a native API that you need, you can develop a plugin which exposes the required functionality. When you develop a NativeScript plugin, keep in mind the following requirements.
+
+- The plugin must be a valid npm package.
+- The plugin must expose a built-in native API or a native API available via custom native libraries.
+- The plugin must be written in JavaScript and must comply with the CommonJS specification. If you are using a transpiler (e.g. from TypeScript), make sure to include the transpiled JavaScript files in your plugin.
+- The plugin directory structure must comply with the specification described below.
+- The plugin must contain a valid `package.json` which complies with the specification described below.
+- If the plugin requires any permissions, features or other configuration specifics, it must contain an `Info.plist` for iOS or a compiled library with an `AndroidManifest.xml` file for Android which describe them. For more information about Android native libraries, see the [Android permissions and resources](#android-permissions-and-resources) section.
+- If the plugin depends on other native libraries, it must contain a valid `include.gradle` or `build.xcconfig` file, which describes the dependencies.
+
+#### Directory Structure
+
+NativeScript plugins which consist of one CommonJS module might have the following directory structure.
+
+```text
+nativescript-my-plugin/
+└── src
+ ├── index.js
+ ├── package.json
+ └── platforms/
+ ├── android/
+ │ └── nativescript-my-plugin.aar (containing custom resources or permissions)
+ └── ios/
+ └── Info.plist
+```
+
+NativeScript plugins which consist of multiple CommonJS modules might have the following directory structure.
+
+```text
+nativescript-my-plugin/
+└── src
+ ├── index.js
+ ├── package.json
+ ├── MyModule1/
+ │ ├── index1.js
+ │ └── package.json
+ ├── MyModule2/
+ │ ├── index2.js
+ │ └── package.json
+ └── platforms/
+ ├── android/
+ │ └── nativescript-my-plugin.aar (containing custom resources or permissions)
+ └── ios/
+ └── Info.plist
+```
+
+- `src`: Putting your source in sub-folder is required for local LiveSync debugging. Older plugins should be updated to move their source code in to a subfolder.
+- `index.js`: This file is the CommonJS module which exposes the native API. You can use platform-specific `*.[platform].js` files. For example: `index.ios.js` and `index.android.js`. During the plugin installation, the NativeScript CLI will copy the platform resources to the `tns_modules` subdirectory in the correct platform destination in the `platforms` directory of your project. Alternatively, you can give any name to this CommonJS module. In this case, however, you need to point to this file by setting the `main` key in the `package.json` for the plugin. For more information, see [Folders as Modules](https://nodejs.org/api/modules.html#modules_folders_as_modules).
+- `package.json`: This file contains the metadata for your plugin. It sets the supported runtimes, the plugin name and version and any dependencies. The `package.json` specification is described in detail below.
+- `platforms/android/native-library.aar` Compiled native libraries (`*.aar` files) contain resources, code and any specific configuration changes, like permissions, required for your plugin to work. For more information about Android native libraries, see the [Android permissions and resources](#android-permissions-and-resources) section.
+- `platforms\ios\Info.plist`: This file describes any specific configuration changes required for your plugin to work. For example, required permissions. To your convenience, all configurations that are applicable via XCode Info tab and are saved in application's Info.plist file can also be applied manually for plugins directly in the Info.plist. For more information about the format of `Info.plist`, see [About Information Property List Files](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/AboutInformationPropertyListFiles.html). During the plugin installation, the NativeScript CLI will merge the plugin `Info.plist` with the `Info.plist` for your project. The NativeScript CLI will not resolve any contradicting or duplicate entries during the merge. After the plugin is installed, you need to manually resolve such issues.
+
+NativeScript plugins which contain both native Android and iOS libraries might have the following directory structure.
+
+```text
+nativescript-my-plugin/
+└── src
+ ├── ...
+ └── platforms/
+ ├── android/
+ │ ├── MyLibraryOne.jar
+ │ ├── MyLibraryTwo.aar
+ │ ├── include.gradle
+ └── ios/
+ ├── MyiOSFramework.framework
+ ├── build.xcconfig
+ ├── Podfile
+ ├── Info.plist
+ ├── MyStaticiOSLibrary.a
+ └── include/
+ └── MyStaticiOSLibrary/
+ └── ...
+```
+
+- `platforms\android`: This directory contains any native Android libraries packaged as `*.jar` and `*.aar` packages. These native libraries can reside in the root of this directory or in a user-created sub-directory. During the plugin installation, the NativeScript CLI will configure the Android project in `platforms\android` to work with the plugin.
+- `platforms\android\include.gradle`: This file modifies the native Android configuration of your NativeScript project such as native dependencies, build types and configurations.
+- `platforms\ios`: This directory contains native dynamic iOS Cocoa Touch Frameworks (`.framework`) and Cocoa Touch Static Libraries (`.a`). During the plugin installation, the NativeScript CLI will copy these files to `lib\iOS` in your project and will configure the iOS project in `platforms\ios` to work with the libraries. If the library is written in Swift, only APIs exposed to Objective-C are exposed to NativeScript. In case the plugin contains a Cocoa Touch Static Library (`.a`), you must place all public headers (`.h`) under `include\\`. Make sure that the static libraries are built at least for the following processor architectures - armv7, arm64, i386.
+- `platforms\ios\build.xcconfig`: This file modifies the native iOS configuration of your NativeScript project such as native dependencies and configurations.
+- `platforms\ios\Podfile`: This file describes the dependency to the library that you want to use. For more information, see [the CocoaPods article](#cocoapods).
+
+#### Package.json Specification
+
+Every NativeScript plugin should contain a valid `package.json` file in its root. This `package.json` file must meet the following requirements.
+
+- It must comply with the [npm specification](https://docs.npmjs.com/files/package.json). The `package.json` must contain at least `name` and `version` pairs. You will later use the plugin in your code by requiring it by its `name`.
+- It must contain a `nativescript` section which describes the supported NativeScript runtimes and their versions. This section can be empty. If you want to define supported platforms and runtimes, you can nest a `platforms` section. In this `platforms` section, you can nest `ios` and `android` key-value pairs. The values in these pairs must be valid runtime versions or ranges of values specified by a valid semver(7) syntax.
+- If the plugin depends on other npm modules, it must contain a `dependencies` section as described [here](https://docs.npmjs.com/files/package.json#dependencies). The NativeScript CLI will resolve the dependencies during the plugin installation.
+
+The following is an example of a `package.json` file for a NativeScript plugin which supports the 1.0.0 version or above of the iOS runtime and the 1.1.0 version or above of the Android runtime.
+
+```JSON
+{
+ "name": "nativescript-my-plugin",
+ "version": "0.0.1",
+ "nativescript": {
+ "platforms": {
+ "ios": "4.0.0",
+ "android": "4.1.0"
+ }
+ }
+}
+```
+
+The above configuration states that the plugin requires iOS runtime version 4.0.0 and up or Android runtime version 4.1.0 and up.
+
+> **Note** In case your plugin supports only iOS or Android, make sure to remove the platform which is not supported.
+
+#### Include.gradle Specification
+
+Every NativeScript plugin, which contains native Android dependencies, should also contain a valid `include.gradle` file in the root of its `platforms\android` directory. This `include.gradle` file must meet the following requirements.
+
+- It must contain its own [configuration](http://developer.android.com/tools/building/configuring-gradle.html).
+- It might contain native dependencies required to build the plugin properly.
+- Any native dependencies should be available in [jcenter](https://bintray.com/bintray/jcenter) or from the Android SDK installed on your machine.
+
+> **IMPORTANT:** If you don't have an `include.gradle` file, at build time, gradle will create a default one containing all default elements.
+
+_Include.gradle Example_
+
+```gradle
+//default elements
+android {
+ productFlavors {
+ "nativescript-my-plugin" {
+ dimension "nativescript-my-plugin"
+ }
+ }
+}
+
+//optional elements
+dependencies {
+ implementation "groupName:pluginName:ver"
+}
+```
+
+#### Android permissions and resources
+
+There are two ways to add permissions and resources for your plugin.
+
+##### Using a native Android project
+
+If you want your plugin to use special permissions, have custom resources or just want to write some native Java code to be accessed later from the JavaScript/Typescript implementation, you should create a native Android project for your plugin, compile it to an `.aar` file and put it in the `src/platforms/android` directory of the plugin package. The easiest way to do this is using Android Studio. The project can contain the following files:
+
+- project/src/main/`AndroidManifest.xml`: This file describes any specific configuration changes required for your plugin to work. For example: required permissions. For more information about the format of `AndroidManifest.xml`, see [App Manifest](http://developer.android.com/guide/topics/manifest/manifest-intro.html).
+- project/src/main/`res`: (Optional) This directory contains resources declared by the `AndroidManifest.xml` file. You can look at its structure [here](http://developer.android.com/guide/topics/resources/providing-resources.html#ResourceTypes).
+- project/src/main/`java`: (Optional) This directory contains Java code sources.
+
+For a more complete Android library project overview visit the [Android Documentation](https://developer.android.com/studio/projects/#ProjectView).
+
+##### Using the NativeScript CLI plugin complier
+
+In previous versions of the the NativeScript CLI it was possible to add permissions and resources for Android without a separate native library (`.aar` file). If you have an older plugin and your `AndroidManifest.xml` file and `res` directory are located in `platforms/android`, then you can compile them with a CLI command. Open a terminal, go to the `src` directory of the plugin and execute:
+
+```bash
+ns plugin build
+```
+
+This will create an `.aar` file in the `platforms/android` directory, which will contain the compiled manifest and resources and should be included in the plugin package instead of them. If you keep `AndroidManifest.xml` and `res` resources in your package, the NativeScript will internally run the `tns plugin build` command when it builds the native application, which will slow down the process for all users of your plugin. This is why the recommended approach is to have an `.aar` library in the `platforms/android` directory of the plugin package instead of plain manifest xml and resource files.
+
+#### Build.xcconfig Specification
+
+Every NativeScript plugin, which contains native iOS dependencies, can also contain a [valid](https://pewpewthespells.com/blog/xcconfig_guide.html) `build.xcconfig` file in the root of its `platforms\ios` directory. This `build.xcconfig` file might contain native dependencies required to build the plugin properly.
+
+_Build.xcconfig Example_
+
+```xcconfig
+OTHER_LDFLAGS = $(inherited) -framework "QuartzCore" -l"sqlite3"
+```
+
+#### Metadata filtering usage specifications
+
+Application author can opt-in for native metadata filtering. Plugins should supply their metadata filtering rules in `platforms/android/native-api-usage.json` and `platforms/ios/native-api-usage.json` files respectively. For more detailed description of this feature read [this article]({% slug metadata%})
+
+### Install a Plugin
+
+To install a plugin for your project, inside your project, run the following command.
+
+```Shell
+ns plugin add
+```
+
+#### Valid Plugin Sources
+
+You can specify a plugin by name in the npm registry, local path or URL. The following are valid values for the `` attribute.
+
+- A `` or `@` for plugins published in the npm registry.
+- A `` to the directory which contains the plugin source files and its `package.json` file.
+- A `` to a `.tar.gz` archive containing a directory with the plugin and its `package.json` file.
+- A `` which resolves to a `.tar.gz` archive containing a directory with the plugin and its `package.json` file.
+- A `` which resolves to a `.tar.gz` archive containing a directory with the plugin and its `package.json` file.
+
+#### Installation Specifics
+
+The installation of a NativeScript plugin mimics the installation of an npm module.
+
+The NativeScript CLI takes the plugin and installs it to the `node_modules` directory in the root of your project. During this process, the NativeScript CLI resolves any dependencies described in the plugin `package.json` file and adds the plugin to the project `package.json` file in the project root.
+
+If the NativeScript CLI detects any native iOS libraries in the plugin, it copies the library files to the `lib\ios` folder in your project and configures the iOS-specific projects in `platforms\ios` to work with the library.
+
+Next, the NativeScript CLI runs a partial `prepare` operation for the plugin for all platforms configured for the project. During this operation, the CLI copies only the plugin to the `tns_modules` subdirectories in the `platforms\android` and `platforms\ios` directories in your project. If your plugin contains platform-specific `JS` files, the CLI copies them to the respective platform subdirectory and renames them by removing the platform modifier.
+
+> **TIP:** If you have not configured any platforms, when you run `$ ns platform add`, the NativeScript CLI will automatically prepare all installed plugins for the newly added platform.
+
+Finally, the CLI merges the plugin `Info.plist` file with `platforms\ios\Info.plist` in your project. The plugin `AndroidManifest.xml` will be merged with `platforms\android\AndroidManifest.xml` later, at build time.
+
+> **IMPORTANT:** Currently, the merging of the platform configuration files does not resolve any contradicting or duplicate entries.
+
+### Use a Plugin
+
+To use a plugin inside your project, you need to add a `require` in your app.
+
+```JavaScript
+var myPlugin = require("nativescript-my-plugin");
+```
+
+This will look for a `nativescript-my-plugin` module with a valid `package.json` file in the `tns_modules` directory. Note that you must require the plugin with the value for the `name` key in the plugin `package.json` file.
+
+### Remove a Plugin
+
+To remove a plugin from your project, inside your project, run the following command.
+
+```Shell
+ns plugin remove
+```
+
+You must specify the plugin by the value for the `name` key in the plugin `package.json` file.
+
+#### Removal Specifics
+
+The removal of a NativeScript plugin mimics the removal of an npm module.
+
+The NativeScript CLI removes any plugin files from the `node_modules` directory in the root of your project. During this process, the NativeScript CLI removes any dependencies described in the plugin `package.json` file and removes the plugin from the project `package.json` file in the project root.
+
+> **IMPORTANT:** For iOS, this operation does not remove files from the `platforms\ios` directories and native iOS libraries, and does not unmerge the `Info.plist` file. For Android, this operation takes care of removing any plugin files located in `platforms\android`.
+
+#### Manual Steps After Removal
+
+After the plugin removal is complete, make sure to remove any leftover native iOS library files from the `lib\ios` directory in the root of the project. Update the iOS-specific projects in `platforms\ios` to remove any dependencies on the removed native libraries.
+
+Next, you need to run the following command.
+
+```Shell
+ns prepare
+```
+
+Make sure to run the command for all platforms configured for the project. During this operation, the NativeScript CLI will remove any leftover plugin files from your `platforms\ios` directory.
+
+> **TIP:** Instead of `$ ns prepare` you can run `$ ns build`, `$ ns run`, `$ ns deploy` or `$ ns emulate`. All these commands run `$ ns prepare`.
+
+Next, open your `platforms\ios\Info.plist` file and remove any leftover entries from the plugin `Info.plist` file.
+
+Finally, make sure to update your code not to use the uninstalled plugin.
+
+## Building Plugins
+
+Building NativeScript plugins is a great way to learn more about how NativeScript works, to create functionality that you can share across applications, and to leverage some really powerful functionality - such as the ability to use native iOS and Android frameworks.
+
+Let's start by looking at the basics of how to structure a NativeScript plugin, and then move on to look at how you can generate that structure using the NativeScript plugin seed.
+
+### Plugin Basics
+
+At their basic level NativeScript plugins are simple JavaScript modules that use well established npm conventions. For example, here's what the world's simplest NativeScript plugin looks like.
+
+```text
+nativescript-hello-world/
+└── src
+ ├── index.js
+ └── package.json
+```
+
+> IMPORTANT: Putting your source in a sub-folder is required for local LiveSync debugging.
+> Older plugins should be updated to move their source code in to a sub-folder.
+
+And here is the simplest possible implementation of that plugin.
+
+```JavaScript
+// index.js
+module.exports = {
+ helloWorld: function() {
+ console.log("Hello World");
+ }
+}
+```
+
+```JSON
+/* package.json */
+{
+ "name": "nativescript-hello-world",
+ "version": "1.0.0",
+ "nativescript": {
+ "platforms": {
+ "ios": "3.0.0",
+ "android": "3.0.0"
+ }
+ }
+}
+```
+
+There are a few things to note in this implementation.
+
+- NativeScript uses the [CommonJS format](http://wiki.commonjs.org/wiki/CommonJS) for defining JavaScript modules. In practical terms that just means you need to know the syntax for importing and exporting functionality (`require`, `export`, and `module.exports`). It's pretty straightforward, and you'll see several examples throughout this guide.
+- NativeScript plugins must have a "nativescript" key in their `package.json` file that specifies the minimum version of the iOS and Android runtimes that the plugin supports. Don't worry about this at the moment, other than to note that it's there.
+
+> **TIP**: Other than the `"nativescript"` key, everything about your plugin's `package.json` file will be identical to any other npm package. Therefore, [the npm docs about the `package.json` file](https://docs.npmjs.com/files/package.json) are a great reference when tinkering with your NativeScript plugin's metadata during development.
+
+To use the above plugin all you need to do is install it in one of your apps.
+
+```bash
+ns plugin add /path/to/nativescript-hello-world/src
+```
+
+> **TIP**: The `ns plugin add` command lets you install plugins from non-npm locations, such as GitHub repos, local folders, or .tgz archives. For details, run `ns plugin add --help` from your command line.
+
+With the plugin installed, you can use the CommonJS `require()` method to import your plugin and use its `helloWorld()` method.
+
+```JavaScript
+var helloWorldModule = require("nativescript-hello-world");
+helloWorldModule.helloWorld();
+```
+
+And with that you have a functional, albeit extremely basic, NativeScript plugin.
+
+Most plugins need to do much more than log a simple string. To build a robust plugin you need some conventions for building, testing, and distributing the plugin you're building. And that's where the official NativeScript plugin seed comes in.
+
+### The NativeScript Plugin Seed
+
+The [NativeScript plugin seed](https://github.com/NativeScript/nativescript-plugin-seed) is a cloneable GitHub repository that makes starting, building, and maintaining NativeScript plugins easy.
+
+Let's look at how the plugin seed works, and in the process build a simple plugin that can retrieve an app's version number on both Android and iOS.
+
+> **NOTE**: Although we recommend using the NativeScript plugin seed, you do have the ability to build your NativeScript plugin from scratch. If you're interested in creating your own plugin development workflow, refer to the [NativeScript plugin reference](/plugins/plugin-reference) for details on exactly how NativeScript plugins are structured.
+
+#### Start Your Plugin
+
+Because the NativeScript plugin seed is a public and open source repository, you'll start your plugin by running `git clone`. The command below clones the seed into a new folder called "nativescript-version-number".
+
+```bash
+git clone https://github.com/NativeScript/nativescript-plugin-seed nativescript-version-number
+```
+
+> **TIP**:
+>
+> - The `git clone` command takes an [optional `` argument](https://git-scm.com/docs/git-clone#git-clone-ltdirectorygt), and you can use it to change the folder name of any repository that you clone. The above command uses this to clone a repository named "nativescript-plugin-seed" into a folder named "nativescript-version-number".
+> - By convention, NativeScript plugins use a naming convention of nativescript-name-of-plugin, which is why this plugin uses the name "nativescript-version-number" instead of something like "nativescript-VersionNumber" or "NativeScriptVersionNumber". Sticking to this naming convention allows developers to find your plugin easily.
+
+You'll learn about the file structure of your plugin momentarily, but first there's one last setup script you need to run. After your `git clone` command finishes, `cd` into your new plugin's `src` folder, and then run the npm `postclone` script.
+
+```bash
+cd nativescript-version-number/src
+npm run postclone
+```
+
+The `postclone` script will ask you a few questions, such as your GitHub username, your plugin's name, and whether you'd like to set up a new git repository for your plugin (You probably want to, as otherwise your repo will start with the source control history of the NativeScript plugin seed itself).
+
+After the `postclone` script completes, your plugin should have a folder structure that looks looks this.
+
+```text
+nativescript-version-number/
+├── demo
+├── publish
+└── src
+```
+
+Here are what these folders do.
+
+- `demo`: Contains a pre-built NativeScript demo app that you'll use to test your plugin in action.
+- `publish`: Contains shell scripts that will help you publish your plugin to npm. We'll come back to this later on.
+- `src`: Contains your plugin's source code.
+
+During development, the NativeScript plugin seed allows you to work on your plugin's source code in your `src` folder, and have the plugin update live in a demo app that lives in your `demo` folder. Let's look at how to set up that workflow.
+
+#### Set Up a Development Workflow
+
+In short, the process can be summarized with the following steps:
+
+1. Run the demo app (which references the plugin), e.g. using `npm run demo ios|android`.
+2. Update the plugin code and see the result in the refreshed app.
+
+Let's run your plugin in the demo app so you can see your plugin in action. Start by opening a new terminal window or command prompt on your development machine. Next, run either `npm run demo.ios` or `npm run demo.android`, to start up the demo app on iOS or Android.
+
+```bash
+# Pick one of these commands and run it while still in the src folder.
+npm run demo.ios
+npm run demo.android
+```
+
+If all went well, you should see the demo app start up and show one of the following screens.
+
+
+
+To show how the development process works, next, open your plugin's `src/version-number.common.ts` file, find the line of code that contains the "Your plugin is working" string, and make a small change. For example you could change the entire line of code that sets the `msg` variable to the following.
+
+```TypeScript
+let msg = `Your plugin is working on ${app.android ? 'Android' : 'iOS'}!`;
+```
+
+After you save this change a few things are going to happen. Next, your `demo` command (`ns run`) will detect the change and automatically refresh your demo app to show your string update.
+
+
+
+> **NOTE**: Wondering how this works? The demo application's `package.json` file is set to reference the plugin's source code in the `src` folder directly. This link allows you to edit files in `src`, and see those changes in your demo immediately.
+
+Pretty cool, huh? With this workflow you have the ability to develop NativeScript plugins just like they're any other files in your NativeScript apps.
+
+Now that you have a workflow in place, let's take a step back and look at the files in `src` in detail, and discuss how you can alter the plugin's default structure to meet your needs.
+
+#### Write Your Plugin
+
+Your plugin's `src` folder is where you'll work on writing your plugin. There are a number of files in this folder, but let's start with the `.ts` files as they're where you'll spend the majority of your time.
+
+```text
+.
+├── version-number.android.ts
+├── version-number.common.ts
+└── version-number.ios.ts
+```
+
+> **NOTE**:
+>
+> - Each `.ts` file will have have a generated `.js` file with the same name, but you can safely ignore those. If you're using Visual Studio Code you can add a [bit of configuration](https://code.visualstudio.com/Docs/languages/typescript#_hiding-derived-javascript-files) to hide generated `.js` files in your editor.
+> - Each `.ts` file also has a generated `.d.ts` file. Don't worry about these files as the NativeScript CLI takes care of creating these files for you. The only `.d.ts` file you need to worry about is `src/index.d.ts`, and you'll learn about that file momentarily.
+
+The `.android.ts` file is where you put the Android implementation of your plugin; the `.ios.ts` file is where you put the iOS implementation of your plugin; and the `.common.ts` file is an optional file where you can put any code you intend to share on both platforms. The shared code in the `.common.ts` file must be referenced in your platform specific `.android.ts` and `.ios.ts` files. For example in `version-number.ios.ts` you will see:
+
+```TypeScript
+import { Common } from './version-number.common';
+```
+
+To get an idea of what all this looks like in action let's implement a basic version of the version number plugin. Start by opening your `src/version-number.common.ts` file deleting all of the starting code, as you'll start with a simple plugin that doesn't share logic across iOS or Android.
+
+Next, open your `version-number.ios.ts` file and paste in the following code.
+
+```TypeScript
+export class VersionNumber {
+ get() {
+ var version = NSBundle.mainBundle.objectForInfoDictionaryKey("CFBundleShortVersionString");
+ return version;
+ }
+}
+```
+
+The NativeScript plugin seed automatically sets up the necessary TypeScript configuration for working with native iOS and Android APIs, so as you develop your plugins you'll get a little help working with these native APIs in TypeScript-friendly editors like Visual Studio Code. For example, if you start to type out `NSBundle`, Visual Studio Code helps you find the native iOS APIs that are available.
+
+
+
+> **TIP**: If you're new to working with native APIs in NativeScript, check out our documentation on [accessing native APIs in JavaScript and TypeScript](https://docs.nativescript.org/core-concepts/accessing-native-apis-with-javascript). You might also want to dive into a few existing plugins' source code just to see how they work. Almost every plugin on the [NativeScript marketplace](http://market.nativescript.org) is open source.
+
+There are still a few more changes you need to make before your plugin is ready to test. Next, open your `src/version-number.android.ts` file and paste in the following code:
+
+```TypeScript
+import { Application } from "@nativescript/core";
+
+export class VersionNumber {
+ get() {
+ var PackageManager = android.content.pm.PackageManager;
+ var pkg = application.android.context.getPackageManager().getPackageInfo(application.android.context.getPackageName(),
+ PackageManager.GET_META_DATA);
+ return pkg.versionName;
+ }
+}
+```
+
+With this you have a functional plugin implementation for both iOS and Android, but you still have one minor configuration change to make.
+
+Open your `src/index.d.ts` file and paste in the following code.
+
+```TypeScript
+export declare class VersionNumber {
+ get(): string;
+}
+```
+
+The `index.d.ts` file serves two purposes: first, it serves as a contract for any application that uses this plugin (you'll see this in a minute when you switch your demo to use this new API). Second, the `.d.ts` file is what enables intellisense or code completion features in TypeScript-friendly editors.
+
+The NativeScript CLI does not generate your `index.d.ts` file, but in most situations you can copy the contents of your `.android.d.ts` file or your `.ios.d.ts` file into your `index.d.ts` file. (The only time you wouldn't want to do that is if your plugin had Android- or iOS-specific APIs that you wanted to expose.)
+
+> **TIP** For more detailed information on writing declaration files refer to [TypeScript's documentation on the topic](https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html).
+
+With that, your plugin is completely functional and can retrieve your app's version number on both iOS and Android. To test this out, head back to your demo app, open your `demo/app/main-view-model.ts` file, find the line of code that sets `this.message`, and change it to use the following line of code.
+
+```TypeScript
+this.message = this.versionNumber.get();
+```
+
+If you still have `npm run demo.ios|android` running, you should see your demo app update to show your app's version number on the screen. (If not, refer back to step 2 and refamiliarize yourself with the plugin development workflow.)
+
+
+
+Now that you have a complete plugin, you're ready to use your plugin in your apps, and to do that you'll need to publish it.
+
+#### Publish Your Plugin
+
+> **WARNING** The publish script of the NativeScript plugin seed requires that you use a bash-enabled terminal or command prompt. If you're on Windows, you can install [GIT SCM](https://git-for-windows.github.io/) and use Git Bash to run these scripts.
+
+Your NativeScript plugin is currently a collection of TypeScript files in a `src` folder. The NativeScript plugin seed provides a series of scripts that can build those files into a distributable npm package.
+
+There are two different scripts that you can run depending on whether you just want to build a plugin package, or whether you want to additionally register that plugin on the npm registry.
+
+Both scripts are in the `publish` folder in your plugin's root folder, so start by using the `cd` command to navigate into that folder:
+
+```bash
+cd ../publish
+```
+
+Next, if you just want to create a package, execute the `pack.sh` script using the following command:
+
+```bash
+./pack.sh
+```
+
+The pack command will build your plugin, and place the built archive in your plugin's `publish/package` folder, for example `publish/package/nativescript-version-number-1.0.0.tgz`. You can then take that plugin package and install it in other NativeScript apps using the `ns plugin add` command:
+
+```bash
+ns plugin add nativescript-version-number-1.0.0.tgz
+```
+
+If you want to publish your new plugin in npm, there are a few additional steps you need to take. First, open your plugin's `src/package.json` file.
+
+Your plugin's `package.json` contains the metadata npm will display about your plugin, so you'll want to make sure that the information listed in this file is correct. Specifically, make sure the `"description"` and `"author"` fields have appropriate values, and also that your `"version"` contains the version number you want npm to use. (You'll need to increment that `"version"` with each subsequent release of your plugin.)
+
+Next, open the `README.md` file in the root of your plugin. The NativeScript plugin seed generates a basic README with a simple outline, but you'll want to replace this file with more complete documentation before you publish your plugin for the world to see. If you're not sure what to put here take a look at what other plugins do. The [version number plugin](https://github.com/tjvantoll/nativescript-version-number) has a dead-simple README you can refer to, and plugins like the [fingerprint auth plugin](https://github.com/EddyVerbruggen/nativescript-fingerprint-auth/) or [MapBox plugin](https://github.com/eddyverbruggen/nativescript-mapbox) provide more complex README patterns you may want to copy from.
+
+Once you're all set with your `package.json` configuration, as well as your `README.md` documentation, return to the `publish` folder or your plugin and run the `publish.sh` script.
+
+```bash
+./publish.sh
+```
+
+The publish command runs through the same build process as the pack command, but after the build completes the command will additionally push your plugin to the npm registry.
+
+> **NOTE**: For the publish command to work you need to be logged into the `npm` CLI using `npm adduser` or `npm login`. For details on how to use these commands see the [npm documentation on the topic](https://docs.npmjs.com/getting-started/publishing-npm-packages).
+
+And that's it! You have now built a simple plugin, set up a robust development workflow, and got everything ready to share your plugin with the world.
+
+And these are just the basics. The plugin seed supports more advanced workflows for your plugin development. You may be interested in trying out:
+
+- [Adding unit tests]({% slug plugin-unit-tests %})
+- [Setting up Travis CI](https://github.com/NativeScript/nativescript-plugin-seed#travisci)
+
+If you run into any problems during your plugin development, reach out on [Stack Overflow](https://stackoverflow.com/questions/tagged/nativescript). And if you'd like to chat with other NativeScript plugin authors, sign up for the [NativeScript slack](https://www.nativescript.org/slack-invitation-form) and join us in the #plugins channel.
+
+### Composite Components
+
+When writing a plugin that shows some UI, you can take different paths. One of the easiest of them is to use existing {N} components as building blocks for a more complex UI component (composite), i.e. no explicit calls to native APIs. Thus you can even sometimes avoid using platform-specific files (like \*.ios.ts, \*.android.ts ...).
+
+#### Bootstrap Your Plugin
+
+First things first - you start off from a regular plugin. You can check the [Building Plugins article]({%slug building-plugins%}) for reference.
+
+#### Add UI bits
+
+Let's say you want to build a simple meme generator component with three properties, which you can use like:
+
+```XML
+
+```
+
+...and when used in an app it looks like:
+
+
+
+You can implement this by creating two files:
+
+- **meme.ts**: Contains properties, the implementation logic, and loads the UI.
+- **meme.xml**: Contains the UI and data bindings.
+
+In **meme.ts**, you need to declare a class with the name of the UI element that will be used in the app:
+
+```TypeScript
+export class Meme extends GridLayout {
+ constructor() {
+ super();
+
+ let innerComponent = builder.load(__dirname + '/meme.xml') as View;
+ innerComponent.bindingContext = this;
+
+ this.addChild(innerComponent);
+ }
+}
+```
+
+As you see, in the constructor, we load the UI from the **meme.xml** and set its **bindingContext** to **this**, so that we can bind the XML to the properties:
+
+```xml
+
+
+
+
+
+
+
+```
+
+The properties themselves are declared and registered in the .ts like:
+
+```TypeScript
+export const topTextProperty = new Property({ name: "topText", defaultValue: undefined });
+export const bottomTextProperty = new Property({ name: "bottomText", defaultValue: undefined });
+export const imageSourceProperty = new Property({ name: "imageSource", defaultValue: undefined });
+
+...
+
+imageSourceProperty.register(Meme);
+topTextProperty.register(Meme);
+bottomTextProperty.register(Meme);
+```
+
+For more details and the full source code of the described meme sample, check the [NativeScript ui-plugin sample repo](https://github.com/NativeScript/nativescript-ui-plugin).
+
+#### Make Your Plugin Angular-Compatible
+
+Having your UI plugin developed successfully you could easily make it Angular-compatible following the steps described in [Supporting Angular in UI Plugins article]({%slug supporting-angular-in-ui-plugins%}).
+
+### Custom Components
+
+Whenever needed UI can be shown by a plugin just by exposing a custom component, e.g. some platform-specific functionality that renders UI itself. To demonstrate that, this article explains how to create a simple button plugin.
+
+#### Prerequisites
+
+The article contains information applicable to apps built with NativeScript 3.x.x or newer version
+
+#### Bootstrap Your Plugin
+
+First things first - you start off from a regular plugin. You can check the [Building Plugins article]({%slug building-plugins%}) for reference.
+
+#### Common Code
+
+Let's say you want to build a simple button which you can use like:
+
+```XML
+
+```
+
+This can be accomplished by wrapping the platform-specific buttons (iOS's UIButton and Android's android.widget.Button) and expose it from a common MyButton class.
+
+You can implement this by creating four files:
+
+- **my-button.d.ts** - holds the declarations of MyButton class, its properties "text" and "myOpacity", enables auto-complete in some IDEs.
+- **my-button.common.ts** - contains the logic accessible from the apps.
+- **my-button.ios.ts** - holds the iOS-specific logic for creation of the native view (UIButton)
+- **my-button.android.ts** - holds the Android-specific logic for creation of the native view (android.widget.Button)
+
+This file holds type definitions for the common logic that will be imported in the app that is using the plugin.
+_my-button.d.ts_
+
+```TypeScript
+import { View, Style, Property, CssProperty, EventData } from "@nativescript/core";
+
+export class MyButton extends View {
+ // static field used from component-builder module to find events on controls.
+ static tapEvent: string;
+
+ // Defines the text property.
+ text: string;
+
+ // Overload 'on' method so that it provides intellisense for 'tap' event.
+ on(event: "tap", callback: (args: EventData) => void, thisArg?: any);
+
+ // Needed when 'on' method is overriden.
+ on(eventNames: string, callback: (data: EventData) => void, thisArg?: any);
+}
+
+export const textProperty: Property;
+export const myOpacityProperty: CssProperty