{% include title.html doc=page coll=page.collection %}
+ {% endif %}
+ {{ content }}
diff --git a/docs/_clef/Rules.md b/docs/_clef/Rules.md
index 200d2519f2..9441181716 100644
--- a/docs/_clef/Rules.md
+++ b/docs/_clef/Rules.md
@@ -1,5 +1,6 @@
---
title: Rules
+sort_key: B
---
The `signer` binary contains a ruleset engine, implemented with [OttoVM](https://github.com/robertkrimen/otto)
diff --git a/docs/_clef/Setup.md b/docs/_clef/Setup.md
index f4b083780d..297f8ddea3 100644
--- a/docs/_clef/Setup.md
+++ b/docs/_clef/Setup.md
@@ -1,5 +1,6 @@
---
title: Advanced setup
+sort_key: B
---
diff --git a/docs/_clef/Tutorial.md b/docs/_clef/Tutorial.md
index a0c4a31aed..513169f682 100644
--- a/docs/_clef/Tutorial.md
+++ b/docs/_clef/Tutorial.md
@@ -1,5 +1,6 @@
---
title: Tutorial
+sort_key: A
---
## Initializing Clef
diff --git a/docs/_clef/apis.md b/docs/_clef/apis.md
index 1bfad02ab9..1932a87fd7 100644
--- a/docs/_clef/apis.md
+++ b/docs/_clef/apis.md
@@ -1,5 +1,6 @@
---
title: Communication APIs
+sort_key: C
---
### External API
diff --git a/docs/_clef/datatypes.md b/docs/_clef/datatypes.md
index c38a621e96..75f7e1914f 100644
--- a/docs/_clef/datatypes.md
+++ b/docs/_clef/datatypes.md
@@ -1,5 +1,6 @@
---
title: Communication data types
+sort_key: C
---
## UI Client interface
diff --git a/docs/_dapp/mobile-accounts.md b/docs/_dapp/mobile-accounts.md
new file mode 100644
index 0000000000..1b9bbd2d07
--- /dev/null
+++ b/docs/_dapp/mobile-accounts.md
@@ -0,0 +1,324 @@
+---
+title: Mobile Account Management
+---
+
+To provide Ethereum integration for your mobile applications, the very first thing you
+should be interested in doing is account management.
+
+Although all current leading Ethereum implementations provide account management built in,
+it is ill advised to keep accounts in any location that is shared between multiple
+applications and/or multiple people. The same way you do not entrust your ISP (who is
+after all your gateway into the internet) with your login credentials; you should not
+entrust an Ethereum node (who is your gateway into the Ethereum network) with your
+credentials either.
+
+The proper way to handle user accounts in your mobile applications is to do client side
+account management, everything self-contained within your own application. This way you
+can ensure as fine grained (or as coarse) access permissions to the sensitive data as
+deemed necessary, without relying on any third party application's functionality and/or
+vulnerabilities.
+
+To support this, `go-ethereum` provides a simple, yet thorough accounts library that gives
+you all the tools to do properly secured account management via encrypted keystores and
+passphrase protected accounts. You can leverage all the security of the `go-ethereum`
+crypto implementation while at the same time running everything in your own application.
+
+## Encrypted keystores
+
+Although handling your users' accounts locally on their own mobile device does provide
+certain security guarantees, access keys to Ethereum accounts should never lay around in
+clear-text form. As such, we provide an encrypted keystore that provides the proper
+security guarantees for you without requiring a thorough understanding from your part of
+the associated cryptographic primitives.
+
+The important thing to know when using the encrypted keystore is that the cryptographic
+primitives used within can operate either in *standard* or *light* mode. The former
+provides a higher level of security at the cost of increased computational burden and
+resource consumption:
+
+ * *standard* needs 256MB memory and 1 second processing on a modern CPU to access a key
+ * *light* needs 4MB memory and 100 millisecond processing on a modern CPU to access a key
+
+As such, *light* is more suitable for mobile applications, but you should be aware of the
+trade-offs nonetheless.
+
+*For those interested in the cryptographic and/or implementation details, the key-store
+uses the `secp256k1` elliptic curve as defined in the [Standards for Efficient
+Cryptography](sec2), implemented by the [`libsecp256k`](secp256k1) library and wrapped by
+[`github.com/ethereum/go-ethereum/accounts`](accounts-go). Accounts are stored on disk in
+the [Web3 Secret Storage](secstore) format.*
+
+[sec2]: http://www.secg.org/sec2-v2.pdf
+[accounts-go]: https://godoc.org/github.com/ethereum/go-ethereum/accounts
+[secp256k1]: https://github.com/bitcoin-core/secp256k1
+[secstore]: https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition
+
+### Keystores on Android (Java)
+
+The encrypted keystore on Android is implemented by the `KeyStore` class from the
+`org.ethereum.geth` package. The configuration constants (for the *standard* or *light*
+security modes described above) are located in the `Geth` abstract class, similarly from
+the `org.ethereum.geth` package. Hence to do client side account management on Android,
+you'll need to import two classes into your Java code:
+
+```java
+import org.ethereum.geth.Geth;
+import org.ethereum.geth.KeyStore;
+```
+
+Afterwards you can create a new encrypted keystore via:
+
+```java
+KeyStore ks = new KeyStore("/path/to/keystore", Geth.LightScryptN, Geth.LightScryptP);
+```
+
+The path to the keystore folder needs to be a location that is writable by the local
+mobile application but non-readable for other installed applications (for security reasons
+obviously), so we'd recommend placing it inside your app's data directory. If you are
+creating the `KeyStore` from within a class extending an Android object, you will most
+probably have access to the `Context.getFilesDir()` method via `this.getFilesDir()`, so
+you could set the keystore path to `this.getFilesDir() + "/keystore"`.
+
+The last two arguments of the `KeyStore` constructor are the crypto parameters defining
+how resource-intensive the keystore encryption should be. You can choose between
+`Geth.StandardScryptN, Geth.StandardScryptP`, `Geth.LightScryptN, Geth.LightScryptP` or
+specify your own numbers (please make sure you understand the underlying cryptography for
+this). We recommend using the *light* version.
+
+### Keystores on iOS (Swift 3)
+
+The encrypted keystore on iOS is implemented by the `GethKeyStore` class from the `Geth`
+framework. The configuration constants (for the *standard* or *light* security modes
+described above) are located in the same namespace as global variables. Hence to do client
+side account management on iOS, you'll need to import the framework into your Swift code:
+
+```swift
+import Geth
+```
+
+Afterwards you can create a new encrypted account manager via:
+
+```swift
+let ks = GethNewKeyStore("/path/to/keystore", GethLightScryptN, GethLightScryptP);
+```
+
+The path to the keystore folder needs to be a location that is writable by the local
+mobile application but non-readable for other installed applications (for security reasons
+obviously), so we'd recommend placing it inside your app's document directory. You should
+be able to retrieve the document directory via `let datadir =
+NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]`, so you
+could set the keystore path to `datadir + "/keystore"`.
+
+The last two arguments of the `GethNewKeyStore` factory method are the crypto parameters
+defining how resource-intensive the keystore encryption should be. You can choose between
+`GethStandardScryptN, GethStandardScryptP`, `GethLightScryptN, GethLightScryptP` or
+specify your own numbers (please make sure you understand the underlying cryptography for
+this). We recommend using the *light* version.
+
+## Account lifecycle
+
+Having created an encrypted keystore for your Ethereum accounts, you can use this for the
+entire account lifecycle requirements of your mobile application. This includes the basic
+functionality of creating new accounts and deleting existing ones; as well as the more
+advanced functionality of updating access credentials, exporting existing accounts, and
+importing them on another device.
+
+Although the keystore defines the encryption strength it uses to store your accounts,
+there is no global master password that can grant access to all of them. Rather each
+account is maintained individually, and stored on disk in its [encrypted
+format](https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition)
+individually, ensuring a much cleaner and stricter separation of credentials.
+
+This individuality however means that any operation requiring access to an account will
+need to provide the necessary authentication credentials for that particular account in
+the form of a passphrase:
+
+ * When creating a new account, the caller must supply a passphrase to encrypt the account
+ with. This passphrase will be required for any subsequent access, the lack of which
+ will forever forfeit using the newly created account.
+ * When deleting an existing account, the caller must supply a passphrase to verify
+ ownership of the account. This isn't cryptographically necessary, rather a protective
+ measure against accidental loss of accounts.
+ * When updating an existing account, the caller must supply both current and new
+ passphrases. After completing the operation, the account will not be accessible via the
+ old passphrase any more.
+ * When exporting an existing account, the caller must supply both the current passphrase
+ to decrypt the account, as well as an export passphrase to re-encrypt it with before
+ returning the key-file to the user. This is required to allow moving accounts between
+ devices without sharing original credentials.
+ * When importing a new account, the caller must supply both the encryption passphrase of
+ the key-file being imported, as well as a new passhprase with which to store the
+ account. This is required to allow storing account with different credentials than used
+ for moving them around.
+
+*Please note, there is no recovery mechanisms for losing the passphrases. The
+cryptographic properties of the encrypted keystore (if using the provided parameters)
+guarantee that account credentials cannot be brute forced in any meaningful time.*
+
+### Accounts on Android (Java)
+
+An Ethereum account on Android is implemented by the `Account` class from the
+`org.ethereum.geth` package. Assuming we already have an instance of a `KeyStore` called
+`ks` from the previous section, we can easily execute all of the described lifecycle
+operations with a handful of function calls.
+
+```java
+// Create a new account with the specified encryption passphrase.
+Account newAcc = ksm.newAccount("Creation password");
+
+// Export the newly created account with a different passphrase. The returned
+// data from this method invocation is a JSON encoded, encrypted key-file.
+byte[] jsonAcc = ks.exportKey(newAcc, "Creation password", "Export password");
+
+// Update the passphrase on the account created above inside the local keystore.
+ks.updateAccount(newAcc, "Creation password", "Update password");
+
+// Delete the account updated above from the local keystore.
+ks.deleteAccount(newAcc, "Update password");
+
+// Import back the account we've exported (and then deleted) above with yet
+// again a fresh passphrase.
+Account impAcc = ks.importKey(jsonAcc, "Export password", "Import password");
+```
+
+*Although instances of `Account` can be used to access various information about specific
+Ethereum accounts, they do not contain any sensitive data (such as passphrases or private
+keys), rather act solely as identifiers for client code and the keystore.*
+
+### Accounts on iOS (Swift 3)
+
+An Ethereum account on iOS is implemented by the `GethAccount` class from the `Geth`
+framework. Assuming we already have an instance of a `GethKeyStore` called `ks` from the
+previous section, we can easily execute all of the described lifecycle operations with a
+handful of function calls.
+
+```swift
+// Create a new account with the specified encryption passphrase.
+let newAcc = try! ks?.newAccount("Creation password")
+
+// Export the newly created account with a different passphrase. The returned
+// data from this method invocation is a JSON encoded, encrypted key-file.
+let jsonKey = try! ks?.exportKey(newAcc!, passphrase: "Creation password", newPassphrase: "Export password")
+
+// Update the passphrase on the account created above inside the local keystore.
+try! ks?.update(newAcc, passphrase: "Creation password", newPassphrase: "Update password")
+
+// Delete the account updated above from the local keystore.
+try! ks?.delete(newAcc, passphrase: "Update password")
+
+// Import back the account we've exported (and then deleted) above with yet
+// again a fresh passphrase.
+let impAcc = try! ks?.importKey(jsonKey, passphrase: "Export password", newPassphrase: "Import password")
+```
+
+*Although instances of `GethAccount` can be used to access various information about
+specific Ethereum accounts, they do not contain any sensitive data (such as passphrases or
+private keys), rather act solely as identifiers for client code and the keystore.*
+
+## Signing authorization
+
+As mentioned above, account objects do not hold the sensitive private keys of the
+associated Ethereum accounts, but are merely placeholders to identify the cryptographic
+keys with. All operations that require authorization (e.g. transaction signing) are
+performed by the account manager after granting it access to the private keys.
+
+There are a few different ways one can authorize the account manager to execute signing
+operations, each having its advantages and drawbacks. Since the different methods have
+wildly different security guarantees, it is essential to be clear on how each works:
+
+ * **Single authorization**: The simplest way to sign a transaction via the keystore is to
+ provide the passphrase of the account every time something needs to be signed, which
+ will ephemerally decrypt the private key, execute the signing operation and immediately
+ throw away the decrypted key. The drawbacks are that the passphrase needs to be queried
+ from the user every time, which can become annoying if done frequently; or the
+ application needs to keep the passphrase in memory, which can have security
+ consequences if not done properly; and depending on the keystore's configured strength,
+ constantly decrypting keys can result in non-negligible resource requirements.
+ * **Multiple authorizations**: A more complex way of signing transactions via the
+ keystore is to unlock the account via its passphrase once, and allow the account
+ manager to cache the decrypted private key, enabling all subsequent signing requests to
+ complete without the passphrase. The lifetime of the cached private key may be managed
+ manually (by explicitly locking the account back up) or automatically (by providing a
+ timeout during unlock). This mechanism is useful for scenarios where the user may need
+ to sign many transactions or the application would need to do so without requiring user
+ input. The crucial aspect to remember is that **anyone with access to the account
+ manager can sign transactions while a particular account is unlocked** (e.g. device
+ left unattended; application running untrusted code).
+
+*Note, creating transactions is out of scope here, so the remainder of this section will
+assume we already have a transaction to sign, and will focus only on creating an
+authorized version of it. Creating an actually meaningful transaction will be covered
+later.*
+
+### Signing on Android (Java)
+
+Assuming we already have an instance of a `KeyStore` called `ks` from the previous
+sections, we can create a new account to sign transactions with via it's already
+demonstrated `newAccount` method; and to avoid going into transaction creation for now, we
+can hard-code a random transaction to sign instead.
+
+```java
+// Create a new account to sign transactions with
+Account signer = ks.newAccount("Signer password");
+Transaction tx = new Transaction(
+ 1, new Address("0x0000000000000000000000000000000000000000"),
+ new BigInt(0), new BigInt(0), new BigInt(1), null); // Random empty transaction
+BigInt chain = new BigInt(1); // Chain identifier of the main net
+```
+
+With the boilerplate out of the way, we can now sign transaction using the authorization
+mechanisms described above:
+
+```java
+// Sign a transaction with a single authorization
+Transaction signed = ks.signTxPassphrase(signer, "Signer password", tx, chain);
+
+// Sign a transaction with multiple manually cancelled authorizations
+ks.unlock(signer, "Signer password");
+signed = ks.signTx(signer, tx, chain);
+ks.lock(signer.getAddress());
+
+// Sign a transaction with multiple automatically cancelled authorizations
+ks.timedUnlock(signer, "Signer password", 1000000000);
+signed = ks.signTx(signer, tx, chain);
+```
+
+### Signing on iOS (Swift 3)
+
+Assuming we already have an instance of a `GethKeyStore` called `ks` from the previous
+sections, we can create a new account to sign transactions with via it's already
+demonstrated `newAccount` method; and to avoid going into transaction creation for now, we
+can hard-code a random transaction to sign instead.
+
+```swift
+// Create a new account to sign transactions with
+var error: NSError?
+let signer = try! ks?.newAccount("Signer password")
+
+let to = GethNewAddressFromHex("0x0000000000000000000000000000000000000000", &error)
+let tx = GethNewTransaction(1, to, GethNewBigInt(0), GethNewBigInt(0), GethNewBigInt(0), nil) // Random empty transaction
+let chain = GethNewBigInt(1) // Chain identifier of the main net
+```
+
+*Note, although Swift usually rewrites `NSError` returns to throws, this particular
+instance seems to have been missed for some reason (possibly due to it being a
+constructor). It will be fixed in a later version of the iOS bindings when the appropriate
+fixed are implemented upstream in the `gomobile` project.*
+
+With the boilerplate out of the way, we can now sign transaction using the authorization
+methods described above:
+
+```swift
+// Sign a transaction with a single authorization
+var signed = try! ks?.signTxPassphrase(signer, passphrase: "Signer password", tx: tx, chainID: chain)
+
+// Sign a transaction with multiple manually cancelled authorizations
+try! ks?.unlock(signer, passphrase: "Signer password")
+signed = try! ks?.signTx(signer, tx: tx, chainID: chain)
+try! ks?.lock(signer?.getAddress())
+
+// Sign a transaction with multiple automatically cancelled authorizations
+try! ks?.timedUnlock(signer, passphrase: "Signer password", timeout: 1000000000)
+signed = try! ks?.signTx(signer, tx: tx, chainID: chain)
+```
+
diff --git a/docs/_dapp/mobile.md b/docs/_dapp/mobile.md
new file mode 100644
index 0000000000..2f550d5286
--- /dev/null
+++ b/docs/_dapp/mobile.md
@@ -0,0 +1,179 @@
+---
+title: Mobile API
+---
+
+The Ethereum blockchain along with its two extension protocols Whisper and Swarm was
+originally conceptualized to become the supporting pillar of web3, providing the
+consensus, messaging and storage backbone for a new generation of distributed (actually,
+decentralized) applications called DApps.
+
+The first incarnation towards this dream of web3 was a command line client providing an
+RPC interface into the peer-to-peer protocols. The client was soon enough extended with a
+web-browser-like graphical user interface, permitting developers to write DApps based on
+the tried and proven HTML/CSS/JS technologies.
+
+As many DApps have more complex requirements than what a browser environment can handle,
+it became apparent that providing programmatic access to the web3 pillars would open the
+door towards a new class of applications. As such, the second incarnation of the web
+dream is to open up all our technologies for other projects as reusable components.
+
+Starting with the 1.5 release family of `go-ethereum`, we transitioned away from providing
+only a full blown Ethereum client and started shipping official Go packages that could be
+embedded into third party desktop and server applications. It took only a small leap from
+here to begin porting our code to mobile platforms.
+
+## Quick overview
+
+Similarly to our reusable Go libraries, the mobile wrappers also focus on four main usage
+areas:
+
+- Simplified client side account management
+- Remote node interfacing via different transports
+- Contract interactions through auto-generated bindings
+- In-process Ethereum, Whisper and Swarm peer-to-peer node
+
+You can watch a quick overview about these in Peter's (@karalabe) talk titled "Import
+Geth: Ethereum from Go and beyond", presented at the Ethereum Devcon2 developer conference
+in September, 2016 (Shanghai). Slides are [available
+here](https://ethereum.karalabe.com/talks/2016-devcon.html).
+
+[![Peter's Devcon2 talk](https://img.youtube.com/vi/R0Ia1U9Gxjg/0.jpg)](https://www.youtube.com/watch?v=R0Ia1U9Gxjg)
+
+## Library bundles
+
+The `go-ethereum` mobile library is distributed either as an Android `.aar` archive
+(containing binaries for `arm-7`, `arm64`, `x86` and `x64`); or as an iOS XCode framework
+(containing binaries for `arm-7`, `arm64` and `x86`). We do not provide library bundles
+for Windows phone the moment.
+
+### Android archive
+
+The simplest way to use `go-ethereum` in your Android project is through a Maven
+dependency. We provide bundles of all our stable releases (starting from v1.5.0) through
+Maven Central, and also provide the latest develop bundle through the Sonatype OSS
+repository.
+
+#### Stable dependency (Maven Central)
+
+To add an Android dependency to the **stable** library release of `go-ethereum`, you'll
+need to ensure that the Maven Central repository is enabled in your Android project, and
+that the `go-ethereum` code is listed as a required dependency of your application. You
+can do both of these by editing the `build.gradle` script in your Android app's folder:
+
+```gradle
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ // All your previous dependencies
+ compile 'org.ethereum:geth:1.5.2' // Change the version to the latest release
+}
+```
+
+#### Develop dependency (Sonatype)
+
+To add an Android dependency to the current version of `go-ethereum`, you'll need to
+ensure that the Sonatype snapshot repository is enabled in your Android project, and that
+the `go-ethereum` code is listed as a required `SNAPSHOT` dependency of your application.
+You can do both of these by editing the `build.gradle` script in your Android app's
+folder:
+
+```gradle
+repositories {
+ maven {
+ url "https://oss.sonatype.org/content/groups/public"
+ }
+}
+
+dependencies {
+ // All your previous dependencies
+ compile 'org.ethereum:geth:1.5.3-SNAPSHOT' // Change the version to the latest release
+}
+```
+
+#### Custom dependency
+
+If you prefer not to depend on Maven Central or Sonatype; or would like to access an older
+develop build not available any more as an online dependency, you can download any bundle
+directly from [our website](https://geth.ethereum.org/downloads/) and insert it into your
+project in Android Studio via `File -> New -> New module... -> Import .JAR/.AAR Package`.
+
+You will also need to configure `gradle` to link the mobile library bundle to your
+application. This can be done by adding a new entry to the `dependencies` section of your
+`build.gradle` script, pointing it to the module you just added (named `geth` by default).
+
+```gradle
+dependencies {
+ // All your previous dependencies
+ compile project(':geth')
+}
+```
+
+#### Manual builds
+
+Lastly, if you would like to make modifications to the `go-ethereum` mobile code and/or
+build it yourself locally instead of downloading a pre-built bundle, you can do so using a
+`make` command. This will create an Android archive called `geth.aar` in the `build/bin`
+folder that you can import into your Android Studio as described above.
+
+```bash
+$ make android
+[...]
+Done building.
+Import "build/bin/geth.aar" to use the library.
+```
+
+### iOS framework
+
+The simplest way to use `go-ethereum` in your iOS project is through a
+[CocoaPods](https://cocoapods.org/) dependency. We provide bundles of all our stable
+releases (starting from v1.5.3) and also latest develop versions.
+
+#### Automatic dependency
+
+To add an iOS dependency to the current stable or latest develop version of `go-ethereum`,
+you'll need to ensure that your iOS XCode project is configured to use CocoaPods.
+Detailing that is out of scope in this document, but you can find a guide in the upstream
+[Using CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html) page.
+Afterwards you can edit your `Podfile` to list `go-ethereum` as a dependency:
+
+```ruby
+target 'MyApp' do
+ # All your previous dependencies
+ pod 'Geth', '1.5.4' # Change the version to the latest release
+end
+```
+
+Alternatively, if you'd like to use the latest develop version, replace the package
+version `1.5.4` with `~> 1.5.5-unstable` to switch to pre-releases and to always pull in
+the latest bundle from a particular release family.
+
+#### Custom dependency
+
+If you prefer not to depend on CocoaPods; or would like to access an older develop build
+not available any more as an online dependency, you can download any bundle directly from
+[our website](https://geth.ethereum.org/downloads/) and insert it into your project in
+XCode via `Project Settings -> Build Phases -> Link Binary With Libraries`.
+
+Do not forget to extract the framework from the compressed `.tar.gz` archive. You can do
+that either using a GUI tool or from the command line via (replace the archive with your
+downloaded file):
+
+```
+tar -zxvf geth-ios-all-1.5.3-unstable-e05d35e6.tar.gz
+```
+
+#### Manual builds
+
+Lastly, if you would like to make modifications to the `go-ethereum` mobile code and/or
+build it yourself locally instead of downloading a pre-built bundle, you can do so using a
+`make` command. This will create an iOS XCode framework called `Geth.framework` in the
+`build/bin` folder that you can import into XCode as described above.
+
+```bash
+$ make ios
+[...]
+Done building.
+Import "build/bin/Geth.framework" to use the library.
+```
diff --git a/docs/_dapp/native-accounts.md b/docs/_dapp/native-accounts.md
new file mode 100644
index 0000000000..7607e1b950
--- /dev/null
+++ b/docs/_dapp/native-accounts.md
@@ -0,0 +1,252 @@
+---
+title: Go Account Management
+---
+
+To provide Ethereum integration for your native applications, the very first thing you
+should be interested in doing is account management.
+
+Although all current leading Ethereum implementations provide account management built in,
+it is ill advised to keep accounts in any location that is shared between multiple
+applications and/or multiple people. The same way you do not entrust your ISP (who is
+after all your gateway into the internet) with your login credentials; you should not
+entrust an Ethereum node (who is your gateway into the Ethereum network) with your
+credentials either.
+
+The proper way to handle user accounts in your native applications is to do client side
+account management, everything self-contained within your own application. This way you
+can ensure as fine grained (or as coarse) access permissions to the sensitive data as
+deemed necessary, without relying on any third party application's functionality and/or
+vulnerabilities.
+
+To support this, `go-ethereum` provides a simple, yet thorough accounts package that gives
+you all the tools to do properly secured account management via encrypted keystores and
+passphrase protected accounts. You can leverage all the security of the `go-ethereum`
+crypto implementation while at the same time running everything in your own application.
+
+## Encrypted keystores
+
+Although handling accounts locally to an application does provide certain security
+guarantees, access keys to Ethereum accounts should never lay around in clear-text form.
+As such, we provide an encrypted keystore that provides the proper security guarantees for
+you without requiring a thorough understanding from your part of the associated
+cryptographic primitives.
+
+The important thing to know when using the encrypted keystore is that the cryptographic
+primitives used within can operate either in *standard* or *light* mode. The former
+provides a higher level of security at the cost of increased computational burden and
+resource consumption:
+
+ * *standard* needs 256MB memory and 1 second processing on a modern CPU to access a key
+ * *light* needs 4MB memory and 100 millisecond processing on a modern CPU to access a key
+
+As such, *standard* is more suitable for native applications, but you should be aware of
+the trade-offs nonetheless in case you you're targeting more resource constrained
+environments.
+
+*For those interested in the cryptographic and/or implementation details, the key-store
+uses the `secp256k1` elliptic curve as defined in the [Standards for Efficient
+Cryptography](sec2), implemented by the [`libsecp256k`](secp256k1) library and wrapped by
+[`github.com/ethereum/go-ethereum/accounts`](accounts-go). Accounts are stored on disk in
+the [Web3 Secret Storage](secstore) format.*
+
+[sec2]: http://www.secg.org/sec2-v2.pdf
+[accounts-go]: https://godoc.org/github.com/ethereum/go-ethereum/accounts
+[secp256k1]: https://github.com/bitcoin-core/secp256k1
+[secstore]: https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition
+
+### Keystores from Go
+
+The encrypted keystore is implemented by the
+[`accounts.Manager`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Manager)
+struct from the
+[`github.com/ethereum/go-ethereum/accounts`](https://godoc.org/github.com/ethereum/go-ethereum/accounts)
+package, which also contains the configuration constants for the *standard* or *light*
+security modes described above. Hence to do client side account management from Go, you'll
+need to import only the `accounts` package into your code:
+
+```go
+import "github.com/ethereum/go-ethereum/accounts"
+```
+
+Afterwards you can create a new encrypted account manager via:
+
+```go
+am := accounts.NewManager("/path/to/keystore", accounts.StandardScryptN, accounts.StandardScryptP);
+```
+
+The path to the keystore folder needs to be a location that is writable by the local user
+but non-readable for other system users (for security reasons obviously), so we'd
+recommend placing it either inside your user's home directory or even more locked down for
+backend applications.
+
+The last two arguments of
+[`accounts.NewManager`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#NewManager)
+are the crypto parameters defining how resource-intensive the keystore encryption should
+be. You can choose between [`accounts.StandardScryptN, accounts.StandardScryptP`,
+`accounts.LightScryptN,
+accounts.LightScryptP`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#pkg-constants)
+or specify your own numbers (please make sure you understand the underlying cryptography
+for this). We recommend using the *standard* version.
+
+## Account lifecycle
+
+Having created an encrypted keystore for your Ethereum accounts, you can use this account
+manager for the entire account lifecycle requirements of your native application. This
+includes the basic functionality of creating new accounts and deleting existing ones; as
+well as the more advanced functionality of updating access credentials, exporting existing
+accounts, and importing them on another device.
+
+Although the keystore defines the encryption strength it uses to store your accounts,
+there is no global master password that can grant access to all of them. Rather each
+account is maintained individually, and stored on disk in its [encrypted
+format](https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition)
+individually, ensuring a much cleaner and stricter separation of credentials.
+
+This individuality however means that any operation requiring access to an account will
+need to provide the necessary authentication credentials for that particular account in
+the form of a passphrase:
+
+ * When creating a new account, the caller must supply a passphrase to encrypt the account
+ with. This passphrase will be required for any subsequent access, the lack of which
+ will forever forfeit using the newly created account.
+ * When deleting an existing account, the caller must supply a passphrase to verify
+ ownership of the account. This isn't cryptographically necessary, rather a protective
+ measure against accidental loss of accounts.
+ * When updating an existing account, the caller must supply both current and new
+ passphrases. After completing the operation, the account will not be accessible via the
+ old passphrase any more.
+ * When exporting an existing account, the caller must supply both the current passphrase
+ to decrypt the account, as well as an export passphrase to re-encrypt it with before
+ returning the key-file to the user. This is required to allow moving accounts between
+ machines and applications without sharing original credentials.
+ * When importing a new account, the caller must supply both the encryption passphrase of
+ the key-file being imported, as well as a new passhprase with which to store the
+ account. This is required to allow storing account with different credentials than used
+ for moving them around.
+
+*Please note, there is no recovery mechanisms for losing the passphrases. The
+cryptographic properties of the encrypted keystore (if using the provided parameters)
+guarantee that account credentials cannot be brute forced in any meaningful time.*
+
+### Accounts from Go
+
+An Ethereum account is implemented by the
+[`accounts.Account`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Account)
+struct from the
+[`github.com/ethereum/go-ethereum/accounts`](https://godoc.org/github.com/ethereum/go-ethereum/accounts)
+package. Assuming we already have an instance of an
+[`accounts.Manager`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Manager)
+called `am` from the previous section, we can easily execute all of the described
+lifecycle operations with a handful of function calls (error handling omitted).
+
+```go
+// Create a new account with the specified encryption passphrase.
+newAcc, _ := am.NewAccount("Creation password");
+
+// Export the newly created account with a different passphrase. The returned
+// data from this method invocation is a JSON encoded, encrypted key-file.
+jsonAcc, _ := am.Export(newAcc, "Creation password", "Export password");
+
+// Update the passphrase on the account created above inside the local keystore.
+am.Update(newAcc, "Creation password", "Update password");
+
+// Delete the account updated above from the local keystore.
+am.Delete(newAcc, "Update password");
+
+// Import back the account we've exported (and then deleted) above with yet
+// again a fresh passphrase.
+impAcc, _ := am.Import(jsonAcc, "Export password", "Import password");
+```
+
+*Although instances of
+[`accounts.Account`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Account)
+can be used to access various information about specific Ethereum accounts, they do not
+contain any sensitive data (such as passphrases or private keys), rather act solely as
+identifiers for client code and the keystore.*
+
+## Signing authorization
+
+As mentioned above, account objects do not hold the sensitive private keys of the
+associated Ethereum accounts, but are merely placeholders to identify the cryptographic
+keys with. All operations that require authorization (e.g. transaction signing) are
+performed by the account manager after granting it access to the private keys.
+
+There are a few different ways one can authorize the account manager to execute signing
+operations, each having its advantages and drawbacks. Since the different methods have
+wildly different security guarantees, it is essential to be clear on how each works:
+
+ * **Single authorization**: The simplest way to sign a transaction via the account
+ manager is to provide the passphrase of the account every time something needs to be
+ signed, which will ephemerally decrypt the private key, execute the signing operation
+ and immediately throw away the decrypted key. The drawbacks are that the passphrase
+ needs to be queried from the user every time, which can become annoying if done
+ frequently; or the application needs to keep the passphrase in memory, which can have
+ security consequences if not done properly; and depending on the keystore's configured
+ strength, constantly decrypting keys can result in non-negligible resource
+ requirements.
+ * **Multiple authorizations**: A more complex way of signing transactions via the account
+ manager is to unlock the account via its passphrase once, and allow the account manager
+ to cache the decrypted private key, enabling all subsequent signing requests to
+ complete without the passphrase. The lifetime of the cached private key may be managed
+ manually (by explicitly locking the account back up) or automatically (by providing a
+ timeout during unlock). This mechanism is useful for scenarios where the user may need
+ to sign many transactions or the application would need to do so without requiring user
+ input. The crucial aspect to remember is that **anyone with access to the account
+ manager can sign transactions while a particular account is unlocked** (e.g.
+ application running untrusted code).
+
+*Note, creating transactions is out of scope here, so the remainder of this section will
+assume we already have a transaction hash to sign, and will focus only on creating a
+cryptographic signature authorizing it. Creating an actual transaction and injecting the
+authorization signature into it will be covered later.*
+
+### Signing from Go
+
+Assuming we already have an instance of an
+[`accounts.Manager`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Manager)
+called `am` from the previous sections, we can create a new account to sign transactions
+with via it's already demonstrated
+[`NewAccount`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Manager.NewAccount)
+method; and to avoid going into transaction creation for now, we can hard-code a random
+[`common.Hash`](https://godoc.org/github.com/ethereum/go-ethereum/common#Hash) to sign
+instead.
+
+```go
+// Create a new account to sign transactions with
+signer, _ := am.NewAccount("Signer password");
+txHash := common.HexToHash("0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef");
+```
+
+With the boilerplate out of the way, we can now sign transaction using the authorization
+mechanisms described above:
+
+```go
+// Sign a transaction with a single authorization
+signature, _ := am.SignWithPassphrase(signer, "Signer password", txHash.Bytes());
+
+// Sign a transaction with multiple manually cancelled authorizations
+am.Unlock(signer, "Signer password");
+signature, _ = am.Sign(signer.Address, txHash.Bytes());
+am.Lock(signer.Address);
+
+// Sign a transaction with multiple automatically cancelled authorizations
+am.TimedUnlock(signer, "Signer password", time.Second);
+signature, _ = am.Sign(signer.Address, txHash.Bytes());
+```
+
+You may wonder why
+[`SignWithPassphrase`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Manager.SignWithPassphrase)
+takes an
+[`accounts.Account`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Account)
+as the signer, whereas
+[`Sign`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Manager.Sign) takes
+only a
+[`common.Address`](https://godoc.org/github.com/ethereum/go-ethereum/common#Address). The
+reason is that an
+[`accounts.Account`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Account)
+object may also contain a custom key-path, allowing
+[`SignWithPassphrase`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Manager.SignWithPassphrase)
+to sign using accounts outside of the keystore; however
+[`Sign`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Manager.Sign) relies
+on accounts already unlocked within the keystore, so it cannot specify custom paths.
+
diff --git a/docs/_developers/Go-bindings-to-Ethereum-contracts.md b/docs/_dapp/native-bindings.md
similarity index 99%
rename from docs/_developers/Go-bindings-to-Ethereum-contracts.md
rename to docs/_dapp/native-bindings.md
index 4e9f2a7d8e..b22b99d3bd 100644
--- a/docs/_developers/Go-bindings-to-Ethereum-contracts.md
+++ b/docs/_dapp/native-bindings.md
@@ -1,6 +1,7 @@
---
-title: Native DApps / Go bindings to Ethereum contracts
+title: Go Contract Bindings
---
+
**[Please note, events are not yet implemented as they need some RPC subscription
features that are still under review.]**
diff --git a/docs/_dapp/native.md b/docs/_dapp/native.md
new file mode 100644
index 0000000000..c6c769fa72
--- /dev/null
+++ b/docs/_dapp/native.md
@@ -0,0 +1,72 @@
+---
+title: Go API
+---
+
+The Ethereum blockchain along with its two extension protocols Whisper and Swarm was
+originally conceptualized to become the supporting pillar of web3, providing the
+consensus, messaging and storage backbone for a new generation of distributed (actually,
+decentralized) applications called DApps.
+
+The first incarnation towards this dream of web3 was a command line client providing an
+RPC interface into the peer-to-peer protocols. The client was soon enough extended with a
+web-browser-like graphical user interface, permitting developers to write DApps based on
+the tried and proven HTML/CSS/JS technologies.
+
+As many DApps have more complex requirements than what a browser environment can handle,
+it became apparent that providing programmatic access to the web3 pillars would open the
+door towards a new class of applications. As such, the second incarnation of the web3
+dream is to open up all our technologies for other projects as reusable components.
+
+Starting with the 1.5 release family of `go-ethereum`, we transitioned away from providing
+only a full blown Ethereum client and started shipping official Go packages that could be
+embedded into third party desktop and server applications.
+
+*Note, this guide will assume you are familiar with Go development. It will make no
+attempts to cover general topics about Go project layouts, import paths or any other
+standard methodologies. If you are new to Go, consider reading its [getting started
+guides](https://github.com/golang/go/wiki#getting-started-with-go) first.*
+
+## Quick overview
+
+Our reusable Go libraries focus on four main usage areas:
+
+- Simplified client side account management
+- Remote node interfacing via different transports
+- Contract interactions through auto-generated bindings
+- In-process Ethereum, Whisper and Swarm peer-to-peer node
+
+You can watch a quick overview about these in Peter's (@karalabe) talk titled "Import
+Geth: Ethereum from Go and beyond", presented at the Ethereum Devcon2 developer conference
+in September, 2016 (Shanghai). Slides are [available
+here](https://ethereum.karalabe.com/talks/2016-devcon.html).
+
+[![Peter's Devcon2 talk](https://img.youtube.com/vi/R0Ia1U9Gxjg/0.jpg)](https://www.youtube.com/watch?v=R0Ia1U9Gxjg)
+
+## Go packages
+
+The `go-ethereum` library is distributed as a collection of standard Go packages straight
+from our GitHub repository. The packages can be used directly via the official Go toolkit,
+without needing any third party tools. External dependencies are vendored locally into
+`vendor`, ensuring both self-containment as well as code stability. If you reuse
+`go-ethereum` in your own project, please follow these best practices and vendor it
+yourself too to avoid any accidental API breakages!
+
+The canonical import path for `go-ethereum` is `github.com/ethereum/go-ethereum`, with all
+packages residing underneath. Although there are [quite a
+number](https://godoc.org/github.com/ethereum/go-ethereum#pkg-subdirectories) of them,
+you'll only need to care about a limited subset, each of which will be properly introduced
+in their relevant section.
+
+You can download all our packages via:
+
+```
+$ go get -d github.com/ethereum/go-ethereum/...
+```
+
+You may also need Go's original context package. Although this was moved into the official
+Go SDK in Go 1.7, `go-ethereum` will depend on the original `golang.org/x/net/context`
+package until we officially drop support for Go 1.5 and Go 1.6.
+
+```
+$ go get -u golang.org/x/net/context
+```
diff --git a/docs/_dapp/tracing.md b/docs/_dapp/tracing.md
new file mode 100644
index 0000000000..85cb89c70c
--- /dev/null
+++ b/docs/_dapp/tracing.md
@@ -0,0 +1,216 @@
+---
+title: EVM Tracing
+---
+
+There are two different types of transactions in Ethereum: plain value transfers and
+contract executions. A plain value transfer just moves Ether from one account to another
+and as such is uninteresting from this guide's perspective. If however the recipient of a
+transaction is a contract account with associated EVM (Ethereum Virtual Machine)
+bytecode - beside transferring any Ether - the code will also be executed as part of the
+transaction.
+
+Having code associated with Ethereum accounts permits transactions to do arbitrarilly
+complex data storage and enables them to act on the previously stored data by further
+transacting internally with outside accounts and contracts. This creates an intertwined
+ecosystem of contracts, where a single transaction can interact with tens or hunderds of
+accounts.
+
+The downside of contract execution is that it is very hard to say what a transaction
+actually did. A transaction receipt does contain a status code to check whether execution
+succeeded or not, but there's no way to see what data was modified, nor what external
+contracts where invoked. In order to introspect a transaction, we need to trace its
+execution.
+
+## Tracing prerequisites
+
+In its simplest form, tracing a transaction entails requesting the Ethereum node to
+reexecute the desired transaction with varying degrees of data collection and have it
+return the aggregated summary for post processing. Reexecuting a transaction however has a
+few prerequisites to be met.
+
+In order for an Ethereum node to reexecute a transaction, it needs to have available all
+historical state accessed by the transaction:
+
+ * Balance, nonce, bytecode and storage of both the recipient as well as all internally invoked contracts.
+ * Block metadata referenced during execution of both the outer as well as all internally created transactions.
+ * Intermediate state generated by all preceding transactions contained in the same block as the one being traced.
+
+Depending on your node's mode of synchronization and pruning, different configurations
+result in different capabilities:
+
+ * An **archive** node retaining **all historical data** can trace arbitrary transactions
+ at any point in time. Tracing a single transaction also entails reexecuting all
+ preceding transactions in the same block.
+ * A **fast synced** node retaining **all historical data** after initial sync can only
+ trace transactions from blocks following the initial sync point. Tracing a single
+ transaction also entails reexecuting all preceding transactions in the same block.
+ * A **fast synced** node retaining only **periodic state data** after initial sync can
+ only trace transactions from blocks following the initial sync point. Tracing a single
+ transaction entails reexecuting all preceding transactions **both** in the same block,
+ as well as all preceding blocks until the previous stored snapshot.
+ * A **light synced** node retrieving data **on demand** can in theory trace transactions
+ for which all required historical state is readily available in the network. In
+ practice, data availability is **not** a feasible assumption.
+
+*There are exceptions to the above rules when running batch traces of entire blocks or
+chain segments. Those will be detailed later.*
+
+## Basic traces
+
+The simplest type of transaction trace that `go-ethereum` can generate are raw EVM opcode
+traces. For every VM instruction the transaction executes, a structured log entry is
+emitted, containing all contextual metadata deemed useful. This includes the *program
+counter*, *opcode name*, *opcode cost*, *remaining gas*, *execution depth* and any
+*occurred error*. The structured logs can optionally also contain the content of the
+*execution stack*, *execution memory* and *contract storage*.
+
+An example log entry for a single opcode looks like:
+
+```json
+{
+ "pc": 48,
+ "op": "DIV",
+ "gasCost": 5,
+ "gas": 64532,
+ "depth": 1,
+ "error": null,
+ "stack": [
+ "00000000000000000000000000000000000000000000000000000000ffffffff",
+ "0000000100000000000000000000000000000000000000000000000000000000",
+ "2df07fbaabbe40e3244445af30759352e348ec8bebd4dd75467a9f29ec55d98d"
+ ],
+ "memory": [
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000060"
+ ],
+ "storage": {
+ }
+}
+```
+
+The entire output of an raw EVM opcode trace is a JSON object having a few metadata
+fields: *consumed gas*, *failure status*, *return value*; and a list of *opcode entries*
+that take the above form:
+
+```json
+{
+ "gas": 25523,
+ "failed": false,
+ "returnValue": "",
+ "structLogs": []
+}
+```
+
+### Generating basic traces
+
+To generate a raw EVM opcode trace, `go-ethereum` provides a few [RPC API
+endpoints](debug-api), out of which the most commonly used is
+[`debug_traceTransaction`](trace-tx).
+
+In its simplest form, `traceTransaction` accepts a transaction hash as its sole argument,
+traces the transaction, aggregates all the generated data and returns it as a **large**
+JSON object. A sample invocation from the Geth console would be:
+
+```js
+debug.traceTransaction("0xfc9359e49278b7ba99f59edac0e3de49956e46e530a53c15aa71226b7aa92c6f")
+```
+
+The same call can of course be invoked from outside the node too via HTTP RPC. In this
+case, please make sure the HTTP endpoint is enabled via `--rpc` and the `debug` API
+namespace exposed via `--rpcapi=debug`.
+
+```
+$ curl -H "Content-Type: application/json" -d '{"id": 1, "method": "debug_traceTransaction", "params": ["0xfc9359e49278b7ba99f59edac0e3de49956e46e530a53c15aa71226b7aa92c6f"]}' localhost:8545
+```
+
+Running the above operation on the Rinkeby network (with a node retaining enough history)
+will result in this [trace dump](rinkeby-example-trace-big).
+
+### Tuning basic traces
+
+By default the raw opcode tracer emits all relevant events that occur within the EVM while
+processing a transaction, such as *EVM stack*, *EVM memory* and *updated storage slots*.
+Certain use cases however may not need some of these data fields reported. To cater for
+those use cases, these massive fields may be omitted using a second *options* parameter
+for the tracer:
+
+```json
+{
+ "disableStack": true,
+ "disableMemory": true,
+ "disableStorage": true
+}
+```
+
+Running the previous tracer invocation from the Geth console with the data fields
+disabled:
+
+```js
+debug.traceTransaction("0xfc9359e49278b7ba99f59edac0e3de49956e46e530a53c15aa71226b7aa92c6f", {disableStack: true, disableMemory: true, disableStorage: true})
+```
+
+Analogously running the filtered tracer from outside the node too via HTTP RPC:
+
+```
+$ curl -H "Content-Type: application/json" -d '{"id": 1, "method": "debug_traceTransaction", "params": ["0xfc9359e49278b7ba99f59edac0e3de49956e46e530a53c15aa71226b7aa92c6f", {"disableStack": true, "disableMemory": true, "disableStorage": true}]}' localhost:8545
+```
+
+Running the above operation on the Rinkeby network will result in this significantly
+shorter [trace dump](rinkeby-example-trace).
+
+### Limits of basic traces
+
+Although the raw opcode traces we've generated above have their use, this basic way of
+tracing is problematic in the real world. Having an individual log entry for every single
+opcode is too low level for most use cases, and will require developers to create
+additional tools to post-process the traces. Additionally, a full opcode trace can easily
+go into the hundreds of megabytes, making them very resource intensive to get out of the
+node and process externally.
+
+To avoid all of the previously mentioned issues, `go-ethereum` supports running custom
+JavaScript tracers *within* the Ethereum node, which have full access to the EVM stack,
+memory and contract storage. This permits developers to only gather the data they need,
+and do any processing **at** the data. Please see the next section for our *custom in-node
+tracers*.
+
+### Pruning
+
+Geth by default does in-memory pruning of state, discarding state entries that it deems is
+no longer necessary to maintain. This is configured via the `--gcmode` option. Often,
+people run into the error that state is not available.
+
+Say you want to do a trace on block `B`. Now there are a couple of cases:
+
+1. You have done a fast-sync, pivot block `P` where `P <= B`.
+2. You have done a fast-sync, pivot block `P` where `P > B`.
+3. You have done a full-sync, with pruning
+4. You have done a full-sync, without pruning (`--gcmode=archive`)
+
+Here's what happens in each respective case:
+
+1. Geth will regenerate the desired state by replaying blocks from the closest point ina
+ time before `B` where it has full state. This defaults to `128` blocks max, but you can
+ specify more in the actual call `... "reexec":1000 .. }` to the tracer.
+2. Sorry, can't be done without replaying from genesis.
+3. Same as 1)
+4. Does not need to replay anything, can immediately load up the state and serve the request.
+
+There is one other option available to you, which may or may not suit your needs. That is
+to use [Evmlab](evmlab).
+
+ docker pull holiman/evmlab && docker run -it holiman/evmlab
+
+There you can use the reproducer. The reproducer will incrementally fetch data from infura
+until it has all the information required to create the trace locally on an evm which is
+bundled with the image. It will create a custom genesis containing the state that the
+transaction touches (balances, code, nonce etc). It should be mentioned that the evmlab
+reproducer is strictly guaranteed to be totally exact with regards to gascosts incurred by
+the outer transaction, as evmlab does not fully calculate the gascosts for nonzero data
+etc, but is usually sufficient to analyze contracts and events.
+
+[evmlab]: https://github.com/holiman/evmlab
+[rinkeby-example-trace]: https://gist.github.com/karalabe/d74a7cb33a70f2af75e7824fc772c5b4
+[rinkeby-example-trace-big]: https://gist.github.com/karalabe/c91f95ac57f5e57f8b950ec65ecc697f
+[debug-api]: ../rpc/ns-debug
+[trace-tx]: ../rpc/ns-debug#debug_tracetransaction
diff --git a/docs/_developers/Active-go-ethereum-projects.md b/docs/_developers/Active-go-ethereum-projects.md
deleted file mode 100644
index 3a2b70a465..0000000000
--- a/docs/_developers/Active-go-ethereum-projects.md
+++ /dev/null
@@ -1,34 +0,0 @@
----
-title: Active go-ethereum projects
----
-## Direction of development until the end of 2018
-
-- Clef: move account management out of geth to clef
-- Constantinople - Tools for testing
-- Automate cross-client testing
-- Progpow (ASIC-resistent PoW algorithm)
-- Ethereum Node Report
-- Topic discovery
-- Build an end-to-end test system
-- Simple API for LES-protocol
-- Loadbalance tests using Swarm team's network simulator
-- Test FlowControl subsystem rewrite
-- Clients get more bandwidth with micro-payment
-- Database IO reductions
-- Historical state pruning
-- Next gen sync algo (cross client)
-- Blockscout for Puppeth
-- Contract based signers for Clique (v1.5)
-- Rinkeby - improve maintenance
-- Concurrent tx execution experiment
-- Dashboard
-- Hive - Devp2p basic tests running as Hive simulation
-- Hive - Devp2p network tests (different clients peering)
-- Hive - Add all known client implementations
-- Hive - Public metrics/test failures page
-- DevP2P - Document protocols
-- Hive - Further tests for networked consensus
-- Discovery - Work with Felix to get ENR/next discovery out asap
-- Countable trie experiment - For better sync statistic and futher storage rent
-- Build an end-to-end test system
-- Finalize simple checkpoint syncing
diff --git a/docs/_developers/Code-Review-Guidelines.md b/docs/_developers/Code-Review-Guidelines.md
index b346c03f86..cfe6ae85d3 100644
--- a/docs/_developers/Code-Review-Guidelines.md
+++ b/docs/_developers/Code-Review-Guidelines.md
@@ -1,6 +1,8 @@
---
title: Code Review Guidelines
+sort_key: B
---
+
The only way to get code into go-ethereum is to send a pull request. Those pull requests
need to be reviewed by someone. This document is a guide that explains our expectations
around PRs for both authors and reviewers.
diff --git a/docs/_developers/Developer-Guide.md b/docs/_developers/Developer-Guide.md
deleted file mode 100644
index 3c9c48c37a..0000000000
--- a/docs/_developers/Developer-Guide.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-title: Developer guide
----
-### Native DApps
-
-[Introduction and packages](Native:-Introduction)
-
-[Account management](Native:-Account-management)
-
-### Mobile platforms
-
-[Introduction and packages](Mobile:-Introduction)
-
-[Account management](Mobile:-Account-management)
-
diff --git a/docs/_developers/Libraries-and-Inproc-Ethereum-Nodes.md b/docs/_developers/Libraries-and-Inproc-Ethereum-Nodes.md
deleted file mode 100644
index 61978aa4af..0000000000
--- a/docs/_developers/Libraries-and-Inproc-Ethereum-Nodes.md
+++ /dev/null
@@ -1,91 +0,0 @@
----
-title: Mobile Clients
----
-**This page has been obsoleted. An new guide is in the progress at [[Mobile: Introduction]]**
-
----
-
-*This page is meant to be a guide on using go-ethereum from mobile platforms. Since neither the mobile libraries nor the light client protocol is finalized, the content here will be sparse, with emphasis being put on how to get your hands dirty. As the APIs stabilize this section will be expanded accordingly.*
-
-### Changelog
-
-* 30th September, 2016: Create initial page, upload Android light bundle.
-
-### Background
-
-Before reading further, please skim through the slides of a Devcon2 talk: [Import Geth: Ethereum from Go and beyond](https://ethereum.karalabe.com/talks/2016-devcon.html), which introduces the basic concepts behind using go-ethereum as a library, and also showcases a few code snippets on how you can do various client side tasks, both on classical computing nodes as well as Android devices. A recording of the talk will be linked when available.
-
-*Please note, the Android and iOS library bundles linked in the presentation will not be updated (for obvious posterity reasons), so always grab latest bundles from this page (until everything is merged into the proper build infrastructure).*
-
-### Mobile bundles
-
-You can download the latest bundles at:
-
- * [Android (30th September, 2016)](https://bintray.com/karalabe/ethereum/download_file?file_path=geth.aar) - `SHA1: 753e334bf61fa519bec83bcb487179e36d58fc3a`
- * iOS: *light client has not yet been bundled*
-
-### Android quickstart
-
-We assume you are using Android Studio for your development. Please download the latest Android `.aar` bundle from above and import it into your Android Studio project via `File -> New -> New Module`. This will result in a `geth` sub-project inside your work-space. To use the library in your project, please modify your apps `build.gradle` file, adding a dependency to the Geth library:
-
-```gradle
-dependencies {
- // All your previous dependencies
- compile project(':geth')
-}
-```
-
-To get you hands dirty, here's a code snippet that will
-
-* Start up an in-process light node inside your Android application
-* Display some initial infos about your node
-* Subscribe to new blocks and display them live as they arrive
-
-
-
-```java
-import org.ethereum.geth.*;
-
-public class MainActivity extends AppCompatActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- setTitle("Android In-Process Node");
- final TextView textbox = (TextView) findViewById(R.id.textbox);
-
- Context ctx = new Context();
-
- try {
- Node node = Geth.newNode(getFilesDir() + "/.ethereum", new NodeConfig());
- node.start();
-
- NodeInfo info = node.getNodeInfo();
- textbox.append("My name: " + info.getName() + "\n");
- textbox.append("My address: " + info.getListenerAddress() + "\n");
- textbox.append("My protocols: " + info.getProtocols() + "\n\n");
-
- EthereumClient ec = node.getEthereumClient();
- textbox.append("Latest block: " + ec.getBlockByNumber(ctx, -1).getNumber() + ", syncing...\n");
-
- NewHeadHandler handler = new NewHeadHandler() {
- @Override public void onError(String error) { }
- @Override public void onNewHead(final Header header) {
- MainActivity.this.runOnUiThread(new Runnable() {
- public void run() { textbox.append("#" + header.getNumber() + ": " + header.getHash().getHex().substring(0, 10) + ".\n"); }
- });
- }
- };
- ec.subscribeNewHead(ctx, handler, 16);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-}
-```
-
-#### Known quirks
-
- * Many constructors (those that would throw exceptions) are of the form `Geth.newXXX()`, instead of simply the Java style `new XXX()` This is an upstream limitation of the [gomobile](https://github.com/golang/mobile) project, one which is currently being worked on to resolve.
- * There are zero documentations attached to the Java library methods. This too is a limitation of the [gomobile](https://github.com/golang/mobile) project. We will try to propose a fix upstream to make our docs from the Go codebase available in Java.
diff --git a/docs/_developers/Peer-to-Peer.md b/docs/_developers/Peer-to-Peer.md
deleted file mode 100644
index 41993e5e90..0000000000
--- a/docs/_developers/Peer-to-Peer.md
+++ /dev/null
@@ -1,161 +0,0 @@
----
-title: Peer-to-peer
----
-The peer to peer package ([go-ethereum/p2p](https://github.com/ethereum/go-ethereum/tree/master/p2p)) allows you to rapidly and easily add peer to peer networking to any type of application. The p2p package is set up in a modular structure and extending the p2p with your own additional sub protocols is easy and straight forward.
-
-Starting the p2p service only requires you setup a `p2p.Server{}` with a few settings:
-
-```go
-import "github.com/ethereum/go-ethereum/crypto"
-import "github.com/ethereum/go-ethereum/p2p"
-
-nodekey, _ := crypto.GenerateKey()
-srv := p2p.Server{
- MaxPeers: 10,
- PrivateKey: nodekey,
- Name: "my node name",
- ListenAddr: ":30300",
- Protocols: []p2p.Protocol{},
-}
-srv.Start()
-```
-
-If we wanted to extend the capabilities of our p2p server we'd need to pass it an additional sub protocol in the `Protocol: []p2p.Protocol{}` array.
-
-An additional sub protocol that has the ability to respond to the message "foo" with "bar" requires you to setup an `p2p.Protocol{}`:
-
-```go
-func MyProtocol() p2p.Protocol {
- return p2p.Protocol{ // 1.
- Name: "MyProtocol", // 2.
- Version: 1, // 3.
- Length: 1, // 4.
- Run: func(peer *p2p.Peer, ws p2p.MsgReadWriter) error { return nil }, // 5.
- }
-}
-```
-
-1. A sub-protocol object in the p2p package is called `Protocol{}`. Each time a peer connects with the capability of handling this type of protocol will use this;
-2. The name of your protocol to identify the protocol on the network;
-3. The version of the protocol.
-4. The amount of messages this protocol relies on. Because the p2p is extendible and thus has the ability to send an arbitrary amount of messages (with a type, which we'll see later) the p2p handler needs to know how much space it needs to reserve for your protocol, this to ensure consensus can be reached between the peers doing a negotiation over the message IDs. Our protocol supports only one; `message` (as you'll see later).
-5. The main handler of your protocol. We've left this intentionally blank for now. The `peer` variable is the peer connected to you and provides you with some basic information regarding the peer. The `ws` variable which is a reader and a writer allows you to communicate with the peer. If a message is being send to us by that peer the `MsgReadWriter` will handle it and vice versa.
-
-Lets fill in the blanks and create a somewhat useful peer by allowing it to communicate with another peer:
-
-```go
-const messageId = 0 // 1.
-type Message string // 2.
-
-func msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error {
- for {
- msg, err := ws.ReadMsg() // 3.
- if err != nil { // 4.
- return err // if reading fails return err which will disconnect the peer.
- }
-
- var myMessage [1]Message
- err = msg.Decode(&myMessage) // 5.
- if err != nil {
- // handle decode error
- continue
- }
-
- switch myMessage[0] {
- case "foo":
- err := p2p.SendItems(ws, messageId, "bar") // 6.
- if err != nil {
- return err // return (and disconnect) error if writing fails.
- }
- default:
- fmt.Println("recv:", myMessage)
- }
- }
-
- return nil
-}
-```
-
-1. The one and only message we know about;
-2. A typed string we decode in to;
-3. `ReadMsg` waits on the line until it receives a message, an error or EOF.
-4. In case of an error during reading it's best to return that error and let the p2p server handle it. This usually results in a disconnect from the peer.
-5. `msg` contains two fields and a decoding method:
- * `Code` contains the message id, `Code == messageId` (i.e., 0)
- * `Payload` the contents of the message.
- * `Decode()` is a helper method for: take `msg.Payload` and decodes the rest of the message in to the given interface. If it fails it will return an error.
-6. If the message we decoded was `foo` respond with a `NewMessage` using the `messageId` message identifier and respond with the message `bar`. The `bar` message would be handled in the `default` case in the same switch.
-
-Now if we'd tie this all up we'd have a working p2p server with a message passing sub protocol.
-
-```go
-package main
-
-import (
- "fmt"
- "os"
-
- "github.com/ethereum/go-ethereum/crypto"
- "github.com/ethereum/go-ethereum/p2p"
-)
-
-const messageId = 0
-
-type Message string
-
-func MyProtocol() p2p.Protocol {
- return p2p.Protocol{
- Name: "MyProtocol",
- Version: 1,
- Length: 1,
- Run: msgHandler,
- }
-}
-
-func main() {
- nodekey, _ := crypto.GenerateKey()
- srv := p2p.Server{
- MaxPeers: 10,
- PrivateKey: nodekey,
- Name: "my node name",
- ListenAddr: ":30300",
- Protocols: []p2p.Protocol{MyProtocol()},
- }
-
- if err := srv.Start(); err != nil {
- fmt.Println(err)
- os.Exit(1)
- }
-
- select {}
-}
-
-func msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error {
- for {
- msg, err := ws.ReadMsg()
- if err != nil {
- return err
- }
-
- var myMessage Message
- err = msg.Decode(&myMessage)
- if err != nil {
- // handle decode error
- continue
- }
-
- switch myMessage {
- case "foo":
- err := p2p.SendItems(ws, messageId, "bar"))
- if err != nil {
- return err
- }
- default:
- fmt.Println("recv:", myMessage)
- }
- }
-
- return nil
-}
-```
-
\ No newline at end of file
diff --git a/docs/_developers/Tracing_Introduction.md b/docs/_developers/Tracing_Introduction.md
deleted file mode 100644
index 9af19396ee..0000000000
--- a/docs/_developers/Tracing_Introduction.md
+++ /dev/null
@@ -1,141 +0,0 @@
----
-title: Tracing / Introduction
----
-There are two different types of transactions in Ethereum: plain value transfers and contract executions. A plain value transfer just moves Ether from one account to another and as such is uninteresting from this guide's perspective. If however the recipient of a transaction is a contract account with associated EVM (Ethereum Virtual Machine) bytecode - beside transferring any Ether - the code will also be executed as part of the transaction.
-
-Having code associated with Ethereum accounts permits transactions to do arbitrarilly complex data storage and enables them to act on the previously stored data by further transacting internally with outside accounts and contracts. This creates an intertwined ecosystem of contracts, where a single transaction can interact with tens or hunderds of accounts.
-
-The downside of contract execution is that it is very hard to say what a transaction actually did. A transaction receipt does contain a status code to check whether execution succeeded or not, but there's no way to see what data was modified, nor what external contracts where invoked. In order to introspect a transaction, we need to trace its execution.
-
-## Tracing prerequisites
-
-In its simplest form, tracing a transaction entails requesting the Ethereum node to reexecute the desired transaction with varying degrees of data collection and have it return the aggregated summary for post processing. Reexecuting a transaction however has a few prerequisites to be met.
-
-In order for an Ethereum node to reexecute a transaction, it needs to have available all historical state accessed by the transaction:
-
- * Balance, nonce, bytecode and storage of both the recipient as well as all internally invoked contracts.
- * Block metadata referenced during execution of both the outer as well as all internally created transactions.
- * Intermediate state generated by all preceding transactions contained in the same block as the one being traced.
-
-Depending on your node's mode of synchronization and pruning, different configurations result in different capabilities:
-
- * An **archive** node retaining **all historical data** can trace arbitrary transactions at any point in time. Tracing a single transaction also entails reexecuting all preceding transactions in the same block.
- * A **fast synced** node retaining **all historical data** after initial sync can only trace transactions from blocks following the initial sync point. Tracing a single transaction also entails reexecuting all preceding transactions in the same block.
- * A **fast synced** node retaining only **periodic state data** after initial sync can only trace transactions from blocks following the initial sync point. Tracing a single transaction entails reexecuting all preceding transactions **both** in the same block, as well as all preceding blocks until the previous stored snapshot.
- * A **light synced** node retrieving data **on demand** can in theory trace transactions for which all required historical state is readily available in the network. In practice, data availability is **not** a feasible assumption.
-
-*There are exceptions to the above rules when running batch traces of entire blocks or chain segments. Those will be detailed later.*
-
-## Basic traces
-
-The simplest type of transaction trace that `go-ethereum` can generate are raw EVM opcode traces. For every VM instruction the transaction executes, a structured log entry is emitted, containing all contextual metadata deemed useful. This includes the *program counter*, *opcode name*, *opcode cost*, *remaining gas*, *execution depth* and any *occurred error*. The structured logs can optionally also contain the content of the *execution stack*, *execution memory* and *contract storage*.
-
-An example log entry for a single opcode looks like:
-
-```json
-{
- "pc": 48,
- "op": "DIV",
- "gasCost": 5,
- "gas": 64532,
- "depth": 1,
- "error": null,
- "stack": [
- "00000000000000000000000000000000000000000000000000000000ffffffff",
- "0000000100000000000000000000000000000000000000000000000000000000",
- "2df07fbaabbe40e3244445af30759352e348ec8bebd4dd75467a9f29ec55d98d"
- ],
- "memory": [
- "0000000000000000000000000000000000000000000000000000000000000000",
- "0000000000000000000000000000000000000000000000000000000000000000",
- "0000000000000000000000000000000000000000000000000000000000000060"
- ],
- "storage": {
- }
-}
-```
-
-The entire output of an raw EVM opcode trace is a JSON object having a few metadata fields: *consumed gas*, *failure status*, *return value*; and a list of *opcode entries* that take the above form:
-
-```json
-{
- "gas": 25523,
- "failed": false,
- "returnValue": "",
- "structLogs": []
-}
-```
-
-### Generating basic traces
-
-To generate a raw EVM opcode trace, `go-ethereum` provides a few [RPC API endpoints](https://github.com/ethereum/go-ethereum/wiki/Management-APIs), out of which the most commonly used is [`debug_traceTransaction`](https://github.com/ethereum/go-ethereum/wiki/Management-APIs#debug_tracetransaction).
-
-In its simplest form, `traceTransaction` accepts a transaction hash as its sole argument, traces the transaction, aggregates all the generated data and returns it as a **large** JSON object. A sample invocation from the Geth console would be:
-
-```js
-debug.traceTransaction("0xfc9359e49278b7ba99f59edac0e3de49956e46e530a53c15aa71226b7aa92c6f")
-```
-
-The same call can of course be invoked from outside the node too via HTTP RPC. In this case, please make sure the HTTP endpoint is enabled via `--rpc` and the `debug` API namespace exposed via `--rpcapi=debug`.
-
-```
-$ curl -H "Content-Type: application/json" -d '{"id": 1, "method": "debug_traceTransaction", "params": ["0xfc9359e49278b7ba99f59edac0e3de49956e46e530a53c15aa71226b7aa92c6f"]}' localhost:8545
-```
-
-Running the above operation on the Rinkeby network (with a node retaining enough history) will result in this [trace dump](https://gist.github.com/karalabe/c91f95ac57f5e57f8b950ec65ecc697f).
-
-### Tuning basic traces
-
-By default the raw opcode tracer emits all relevant events that occur within the EVM while processing a transaction, such as *EVM stack*, *EVM memory* and *updated storage slots*. Certain use cases however may not need some of these data fields reported. To cater for those use cases, these massive fields may be omitted using a second *options* parameter for the tracer:
-
-```json
-{
- "disableStack": true,
- "disableMemory": true,
- "disableStorage": true
-}
-```
-
-Running the previous tracer invocation from the Geth console with the data fields disabled:
-
-```js
-debug.traceTransaction("0xfc9359e49278b7ba99f59edac0e3de49956e46e530a53c15aa71226b7aa92c6f", {disableStack: true, disableMemory: true, disableStorage: true})
-```
-
-Analogously running the filtered tracer from outside the node too via HTTP RPC:
-
-```
-$ curl -H "Content-Type: application/json" -d '{"id": 1, "method": "debug_traceTransaction", "params": ["0xfc9359e49278b7ba99f59edac0e3de49956e46e530a53c15aa71226b7aa92c6f", {"disableStack": true, "disableMemory": true, "disableStorage": true}]}' localhost:8545
-```
-
-Running the above operation on the Rinkeby network will result in this significantly shorter [trace dump](https://gist.github.com/karalabe/d74a7cb33a70f2af75e7824fc772c5b4).
-
-### Limits of basic traces
-
-Although the raw opcode traces we've generated above have their use, this basic way of tracing is problematic in the real world. Having an individual log entry for every single opcode is too low level for most use cases, and will require developers to create additional tools to post-process the traces. Additionally, a full opcode trace can easily go into the hundreds of megabytes, making them very resource intensive to get out of the node and process externally.
-
-To avoid all of the previously mentioned issues, `go-ethereum` supports running custom JavaScript tracers *within* the Ethereum node, which have full access to the EVM stack, memory and contract storage. This permits developers to only gather the data they need, and do any processing **at** the data. Please see the next section for our *custom in-node tracers*.
-
-### Pruning
-
-Geth by default does in-memory pruning of state, discarding state entries that it deems is no longer necessary to maintain. This is configured via the `--gcmode` option. Often, people run into the error that state is not available.
-
-Say you want to do a trace on block `B`. Now there are a couple of cases:
-
-1. You have done a fast-sync, pivot block `P` where `P <= B`.
-2. You have done a fast-sync, pivot block `P` where `P > B`.
-3. You have done a full-sync, with pruning
-4. You have done a full-sync, without pruning (`--gcmode=archive`)
-
-Here's what happens in each respective case:
-
-1. Geth will regenerate the desired state by replaying blocks from the closest point in time before `B` where it has full state. This defaults to [`128`](https://github.com/ethereum/go-ethereum/blob/master/eth/api_tracer.go#L52) blocks max, but you can specify more in the actual call `... "reexec":1000 .. }` to the tracer.
-2. Sorry, can't be done without replaying from genesis.
-3. Same as 1)
-4. Does not need to replay anything, can immediately load up the state and serve the request.
-
-There is one other option available to you, which may or may not suit your needs. That is to use [Evmlab]( https://github.com/holiman/evmlab).
-```
-docker pull holiman/evmlab && docker run -it holiman/evmlab
-```
-There you can use the reproducer. The reproducer will incrementally fetch data from infura until it has all the information required to create the trace locally on an evm which is bundled with the image. It will create a custom genesis containing the state that the transaction touches (balances, code, nonce etc). It should be mentioned that the evmlab reproducer is strictly guaranteed to be totally exact with regards to gascosts incurred by the outer transaction, as evmlab does not fully calculate the gascosts for nonzero data etc, but is usually sufficient to analyze contracts and events.
diff --git a/docs/_install-and-build/Developers-Guide.md b/docs/_developers/devguide.md
similarity index 98%
rename from docs/_install-and-build/Developers-Guide.md
rename to docs/_developers/devguide.md
index 1136ff7aaf..0a26486b32 100644
--- a/docs/_install-and-build/Developers-Guide.md
+++ b/docs/_developers/devguide.md
@@ -1,8 +1,10 @@
---
-title: Developers' guide
+title: Developer guide
+sort_key: A
---
+
**NOTE: These instructions are for people who want to contribute Go source code changes.
-If you just want to run ethereum, use the normal [Installation Instructions](installing-geth)**
+If you just want to run ethereum, use the normal [Installation Instructions](../install-and-build/installing-geth)**
This document is the entry point for developers of the Go implementation of Ethereum. Developers here refer to the hands-on: who are interested in build, develop, debug, submit a bug report or pull request or contribute code to go-ethereum.
diff --git a/docs/_support/Issue-handling-workflow.md b/docs/_developers/issue-handling-workflow.md
similarity index 97%
rename from docs/_support/Issue-handling-workflow.md
rename to docs/_developers/issue-handling-workflow.md
index bc936260ad..9fb2bdc180 100644
--- a/docs/_support/Issue-handling-workflow.md
+++ b/docs/_developers/issue-handling-workflow.md
@@ -1,7 +1,10 @@
---
-title: Issue handling workflow
+title: Issue Handling Workflow
+sort_key: B
---
+
### (Draft proposal)
+
Keep the number of open issues under 820
Keep the ratio of open issues per all issues under 13%
@@ -51,4 +54,4 @@ We have a weekly or bi-weekly triage meeting. Issues are preselected by [labelli
Optional further activities:
* Label the issue with the appropriate area/component.
-* Add a section to the FAQ or add a wiki page. Link to it from the issue.
\ No newline at end of file
+* Add a section to the FAQ or add a wiki page. Link to it from the issue.
diff --git a/docs/_doc/Accounts---key-storage-specification.md b/docs/_doc/Accounts---key-storage-specification.md
deleted file mode 100644
index ff1e4d86a7..0000000000
--- a/docs/_doc/Accounts---key-storage-specification.md
+++ /dev/null
@@ -1,74 +0,0 @@
----
-title: Accounts
----
-**THIS PAGE IS PARTLY OUTDATED! TODO: REFACTOR OR DELETE**
-
-# Accounts / key storage specification
-
-This is an attempt to compile a single, written specification from the multiple sources which have so far been used for accounts / key storage specs:
-
-* Skype calls
-* Skype chats
-* Email conversations
-* Github issues
-* Github pull request comments
-* Github commits
-* Lively in-person discussions in the Amsterdam office.
-* Several past instances of the Amsterdam office whiteboard contents.
-
-# Background
-
-Up until Ethereum PoC 8, the Go client has used a single, default key in plaintext on disk for use as wallet and for signing all txs. We want to extend this to have a more generic key storage supporting multiple keys. We also want an "accounts" abstraction over these keys where an account corresponds to a key, and a user can have multiple accounts and be able to send / receive to any of them.
-
-The goal of this is to support better wallet / account functionality both in Mist as well as in DAPPs.
-
-# Specification
-
-## Key Storage
-
-The key storage must support:
-
-1. Generation of new keys
-2. Deletion of keys.
-3. Multiple, uniquely identifiable keys.
-4. Password protection of keys.
-5. Persistence of keys (e.g. on disk)
-6. Export & Import of keys.
-7. Import of pre-sale keys (generated by https://github.com/ethereum/pyethsaletool) NOTE: this is a different import functionality than general import (6)
-8. Proper use of secure cryptography for key generation, password protection, key persistence and export format of keys.
-9. Mechanism for Backing the keys up – maybe automatically
-
-## Account Manager
-
-0. Account == address of an Ethereum account == address of EC public key of EC private key the user controls.
-
-The account manager must support:
-
-1. Account creation & deletion
-2. Multiple, unique accounts.
-3. Persistence of accounts (e.g. on disk)
-4. An account is mapped to a single key.
-5. The account is identifiable by some public, non-sensitive data. E.g. the Ethereum address of a EC keypair can be used as account identifier / address.
-
-## Mist
-
-The Mist UI must support:
-
-1. Creation of a new account.
-2. Display a list of all available accounts (addresses)
-3. Copy-paste of account addresses to easily use when receiving funds.
-4. Choosing one of the available accounts when sending a tx.
-5. Typing password when accessing one of the hot wallet keys
-6. Showing the possible ways to temporarily input wallet keys when needed
-
-## RPC API
-
-The RPC API must support:
-
-1. The list of accounts is exposed through the eth_accounts API: https://github.com/ethereum/wiki/JSON-RPC#eth_accounts
-2. Using any of the available accounts as from/sender with the eth_transact API: https://github.com/ethereum/wiki/JSON-RPC#eth_transact (NOTE: the current API definition on that wiki page does not include a from/sender field!)
-
-
-## Wallet DAPP
-
-TODO:
\ No newline at end of file
diff --git a/docs/_doc/Gas-Price-Oracle.md b/docs/_doc/Gas-Price-Oracle.md
deleted file mode 100644
index c3672130ba..0000000000
--- a/docs/_doc/Gas-Price-Oracle.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-title: Gas price oracle
----
-The gas price oracle is a helper function of the Geth client that tries to find an appropriate default gas price when sending transactions. It can be parametrized with the following command line options:
-
-- `gpomin`: lower limit of suggested gas price. This should be set at least as high as the `gasprice` setting usually used by miners so that your transactions will not be rejected automatically because of a too low price.
-
-- `gpomax`: higher limit of suggested gas price. During load peaks when there is a competition between transactions to get into the blocks, the price needs to be limited, otherwise the oracle would eventually try to overbid everyone else at any price.
-
-- `gpofull`: a block is considered "full" when a certain percentage of the block gas limit (specified in percents) is used up by transactions. If a block is not "full", that means that a transaction could have been accepted even with a minimal price offered.
-
-- `gpobasedown`: an exponential ratio (specified in `1/1000ths`) by which the base price decreases when the lowest acceptable price of the last block is below the last base price.
-
-- `gpobaseup`: an exponential ratio (specified in `1/1000ths`) by which the base price increases when the lowest acceptable price of the last block is over the last base price.
-
-- `gpobasecf`: a correction factor (specified in percents) of the base price. The suggested price is the corrected base price, limited by `gpomin` and `gpomax`.
-
-The lowest acceptable price is defined as a price that could have been enough to insert a transaction into a certain block. Although this value varies slightly with the gas used by the particular transaction, it is aproximated as follows: if the block is full, it is the lowest transaction gas price found in that block. If the block is not full, it equals to gpomin.
-
-The base price is a moving value that is adjusted from block to block, up if it was lower than the lowest acceptable price, down otherwise. Note that there is a slight amount of randomness added to the correction factors so that your client will not behave absolutely predictable on the market.
-
-If you want to specify a constant for the default gas price and not use the oracle, set both `gpomin` and `gpomax` to the same value.
\ No newline at end of file
diff --git a/docs/_doc/Japanese-Contracts-and-Transactions.md b/docs/_doc/Japanese-Contracts-and-Transactions.md
deleted file mode 100644
index d7a15f2e64..0000000000
--- a/docs/_doc/Japanese-Contracts-and-Transactions.md
+++ /dev/null
@@ -1,397 +0,0 @@
----
-title: Contracts and transactions (Japanese)
----
-THIS WIKI IS BEING EDITED AND REVIEWED NOW. PLEASE DO NOT RELY ON IT.
-
-# Account types and transactions
-
-There are two types of accounts in Ethereum state:
-* Normal or externally controlled accounts and
-* contracts, i.e., sinppets of code, think a class.
-
-Both types of accounts have an ether balance.
-
-Transactions can be fired from from both types of accounts, though contracts only fire transactions in response to other transactions that they have received. Therefore, all action on ethereum block chain is set in motion by transactions fired from externally controlled accounts.
-
-The simplest transactions are ether transfer transactions. But before we go into that you should read up on [accounts](../interface/managing-your-accounts) and perhaps on [mining](../legacy/mining).
-
-## Ether transfer
-
-Assuming the account you are using as sender has sufficient funds, sending ether couldn't be easier. Which is also why you should probably be careful with this! You have been warned.
-
-```js
-eth.sendTransaction({from: '0x036a03fc47084741f83938296a1c8ef67f6e34fa', to: '0xa8ade7feab1ece71446bed25fa0cf6745c19c3d5', value: web3.toWei(1, "ether")})
-```
-
-Note the unit conversion in the `value` field. Transaction values are expressed in weis, the most granular units of value. If you want to use some other unit (like `ether` in the example above), use the function `web3.toWei` for conversion.
-
-Also, be advised that the amount debited from the source account will be slightly larger than that credited to the target account, which is what has been specified. The difference is a small transaction fee, discussed in more detail later.
-
-Contracts can receive transfers just like externally controlled accounts, but they can also receive more complicated transactions that actually run (parts of) their code and update their state. In order to understand those transactions, a rudimentary understanding of contracts is required.
-
-# contract のコンパイル
-
-blockchain 上で有効となる contract は Ethereum 特別仕様の バイナリの形式で、EVM byte コード と呼ばれます。
-しかしながら、典型的には、contract は [solidity](https://github.com/ethereum/wiki/wiki/Solidity-Tutorial) のような高級言語で記述され、blockchain 上に upload するために、この byte コードへコンパイルされます。
-
-flontier リリースでは、geth は Christian R. と Lefteris K が手がけた、コマンドライン [solidity コンパイラ](https://solidity.readthedocs.io/en/latest/installing-solidity.html) である `solc` をシステムコールで呼び出すことを通して、solidity コンパイルをサポートしています。
-以下もお試しください。
-* [Solidity realtime compiler](https://chriseth.github.io/cpp-ethereum/) (by Christian R)
-* [Cosmo](https://github.com/cosmo-project/meteor-dapp-cosmo)
-* [Mix]()
-* [AlethZero]()
-
-
-
-Note that other languages also exist, notably [serpent]() and [lll]().
-
-If you start up your `geth` node, you can check if this option is immediately available. This is what happens, if it is not:
-
-```js
-eth.getCompilers()
-['' ]
-> eth.compile.solidity("")
-error: eth_compileSolidity method not implemented
-Invalid JSON RPC response
-```
-
-After you found a way to install `solc`, you make sure it's in the path, if [`eth.getCompilers()`](https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgetcompilers) still does not find it (returns an empty array), you can set a custom path to the `sol` executable on the command line using th `solc` flag.
-
-```
-geth --datadir ~/frontier/00 --solc /usr/local/bin/solc --natspec
-```
-
-You can also set this option at runtime via the console:
-
-```js
-> admin.setSolc("/usr/local/bin/solc")
-solc v0.9.13
-Solidity Compiler: /usr/local/bin/solc
-Christian and Lefteris (c) 2014-2015
-true
-```
-
-Let us take this simple contract source:
-
-```js
-> source = "contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"
-```
-
-This contract offers a unary method: called with a positive integer `a`, it returns `a * 7`.
-Note that this document is not about writing interesting contracts or about the features of solidity.
-
-For more information on contract language, go through [solidity tutorial](https://github.com/ethereum/wiki/wiki/Solidity-Tutorial), browse the contracts in our [dapp-bin](https://github.com/ethereum/dapp-bin/wiki), see other solidity and dapp resources.
-
-You are ready to compile solidity code in the `geth` JS console using [`eth.compile.solidity`](https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethcompilesolidity):
-
-```js
-> contract = eth.compile.solidity(source)
-{
- code: '605280600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b60376004356041565b8060005260206000f35b6000600782029050604d565b91905056',
- info: {
- language: 'Solidity',
- languageVersion: '0',
- compilerVersion: '0.9.13',
- abiDefinition: [{
- constant: false,
- inputs: [{
- name: 'a',
- type: 'uint256'
- } ],
- name: 'multiply',
- outputs: [{
- name: 'd',
- type: 'uint256'
- } ],
- type: 'function'
- } ],
- userDoc: {
- methods: {
- }
- },
- developerDoc: {
- methods: {
- }
- },
- source: 'contract test { function multiply(uint a) returns(uint d) { return a * 7; } }'
- }
-}
-```
-
-The compiler is also available via [RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC) and therefore via [web3.js](https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethcompilesolidity) to any in-browser Ðapp connecting to `geth` via RPC.
-
-The following example shows how you interface `geth` via JSON-RPC to use the compiler.
-
-```
-./geth --datadir ~/eth/ --loglevel 6 --logtostderr=true --rpc --rpcport 8100 --rpccorsdomain '*' --mine console 2>> ~/eth/eth.log
-curl -X POST --data '{"jsonrpc":"2.0","method":"eth_compileSolidity","params":["contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"],"id":1}' http://127.0.0.1:8100
-```
-
-The compiler output is combined into an object representing a single contract and is serialised as json. It contains the following fields:
-
-* `code`: the compiled EVM code
-* `source`: the source code
-* `language`: contract language (Solidity, Serpent, LLL)
-* `languageVersion`: contract language version
-* `compilerVersion`: compiler version
-* `abiDefinition`: [Application Binary Interface Definition](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI)
-* `userDoc`: [NatSpec user Doc](https://github.com/ethereum/wiki/wiki/Ethereum-Natural-Specification-Format)
-* `developerDoc`: [NatSpec developer Doc](https://github.com/ethereum/wiki/wiki/Ethereum-Natural-Specification-Format)
-
-The immediate structuring of the compiler output (into `code` and `info`) reflects the two very different **paths of deployment**.
-The compiled EVM code is sent off to the blockchain with a contract creation transaction while the rest (info) will ideally live on the decentralised cloud as publicly verifiable metadata complementing the code on the blockchain.
-
-# Creating and deploying a contract
-
-Now that you got both an unlocked account as well as some funds, you can create a contract on the blockchain by [sending a transaction](https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethsendtransaction) to the empty address with the evm code as data. Simple, eh?
-
-```js
-primaryAddress = eth.accounts[0]
-contractAddress = eth.sendTransaction({from: primaryAddress, data: evmCode})
-```
-
-All binary data is serialised in hexadecimal form. Hex strings always have a hex prefix `0x`.
-
-Note that this step requires you to pay for execution. Your balance on the account (that you put as sender in the `from` field) will be reduced according to the gas rules of the VM once your transaction makes it into a block. More on that later. After some time, your transaction should appear included in a block confirming that the state it brought about is a consensus. Your contract now lives on the blockchain.
-
-The asynchronous way of doing the same looks like this:
-
-```js
-eth.sendTransaction({from: primaryAccount, data: evmCode}, function(err, address) {
- if (!err)
- console.log(address);
-});
-```
-
-# Gas and transaction costs
-
-So how did you pay for all this? Under the hood, the transaction specified a gas limit and a gasprice, both of which could have been specified directly in the transaction object.
-
-Gas limit is there to protect you from buggy code running until your funds are depleted. The product of `gasPrice` and `gas` represents the maximum amount of Wei that you are willing to pay for executing the transaction. What you specify as `gasPrice` is used by miners to rank transactions for inclusion in the blockchain. It is the price in Wei of one unit of gas, in which VM operations are priced.
-
-The gas expenditure incurred by running your contract will be bought by the ether you have in your account at a price you specified in the transaction with `gasPrice`. If you do not have the ether to cover all the gas requirements to complete running your code, the processing aborts and all intermediate state changes roll back to the pre-transaction snapshot. The gas used up to the point where execution stopped were used after all, so the ether balance of your account will be reduced. These parameters can be adjusted on the transaction object fields `gas` and `gasPrice`. The `value` field is used the same as in ether transfer transactions between normal accounts. In other words transferring funds is available between any two accounts, either normal (i.e. externally controlled) or contract. If your contract runs out of funds, you should see an insufficient funds error. Note that all funds on contract accounts will be irrecoverably lost, once we release Homestead.
-
-For testing and playing with contracts you can use the test network or set up a private node (or cluster) potentially isolated from all the other nodes. If you then mine, you can make sure that your transaction will be included in the next block. You can see the pending transactions with:
-
-```js
-eth.getBlock("pending", true).transactions
-```
-
-You can retrieve blocks by number (height) or by their hash:
-
-```js
-genesis = eth.getBlock(0)
-eth.getBlock(genesis.hash).hash == genesis.hash
-true
-```
-
-Use `eth.blockNumber` to get the current blockchain height and the "latest" magic parameter to access the current head (newest block).
-
-```js
-currentHeight = eth.blockNumber()
-eth.getBlock("latest").hash == eth.getBlock(eth.blockNumber).hash
-true
-```
-
-# Contract info (metadata)
-
-In the previous sections we explained how you create a contract on the blockchain. Now we deal with the rest of the compiler output, the **contract metadata** or contract info.
-The idea is that
-
-* contract info is uploaded somewhere identifiable by a `url` which is publicly accessible
-* anyone can find out what the `url` is only knowing the contracts address
-
-These requirements are achieved very simply by using a 2 step blockchain registry. The first step registers the contract code (hash) with a content hash in a contract called `HashReg`. The second step registers a url with the content hash in the `UrlHint` contract.
-These [simple registry contracts]() will be part of the frontier proposition.
-
-By using this scheme, it is sufficient to know a contract's address to look up the url and fetch the actual contract metadata info bundle. Read on to learn why this is good.
-
-So if you are a conscientious contract creator, the steps are the following:
-
-1. Get the contract info json file.
-2. Deploy contract info json file to any url of your choice
-3. Register codehash ->content hash -> url
-4. Deploy the contract itself to the blockchain
-
-The JS API makes this process very easy by providing helpers. Call [`admin.contractInfo.register`]() to extract info from the contract, write out its json serialisation in the given file, calculates the content hash of the file and finally registers this content hash to the contract's code hash.
-Once you deployed that file to any url, you can use [`admin.contractInfo.registerUrl`]() to register the url with your content hash on the blockchain as well. (Note that in case a fixed content addressed model is used as document store, the url-hint is no longer necessary.)
-
-```js
-source = "contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"
-// compile with solc
-contract = eth.compile.solidity(source)
-// send off the contract to the blockchain
-address = eth.sendTransaction({from: primaryAccount, data: contract.code})
-// extracts info from contract, save the json serialisation in the given file,
-// calculates the content hash and registers it with the code hash in `HashReg`
-// it uses address to send the transaction.
-// returns the content hash that we use to register a url
-hash = admin.contractInfo.register(primaryAccount, address, contract, "~/dapps/shared/contracts/test/info.json")
-// here you deploy ~/dapps/shared/contracts/test/info.json to a url
-admin.contractInfo.registerUrl(primaryAccount, hash, url)
-```
-
-# Interacting with contracts
-
-[`eth.contract`](https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethcontract) can be used to define a contract _class_ that will comply with the contract interface as described in its [ABI definition](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI).
-
-```js
-var Multiply7 = eth.contract(contract.info.abiDefinition);
-var multiply7 = new Multiply7(address);
-```
-
-Now all the function calls specified in the abi are made available on the contract instance. You can just call those methods on the contract instance and chain `sendTransaction({from: address})` or `call()` to it. The difference between the two is that `call` performs a "dry run" locally, on your computer, while `sendTransaction` would actually submit your transaction for inclusion in the block chain and the results of its execution will eventually become part of the global consensus. In other words, use `call`, if you are interested only in the return value and use `sendTransaction` if you only care about "side effects" on the state of the contract.
-
-In the example above, there are no side effects, therefore `sendTransaction` only burns gas and increases the entropy of the universe. All "useful" functionality is exposed by `call`:
-
-```js
-multiply7.multiply.call(6)
-42
-```
-
-Now suppose this contract is not yours, and you would like documentation or look at the source code.
-This is made possible by making available the contract info bundle and register it in the blockchain.
-The `admin.contractInfo` API provides convenience methods to fetch this bundle for any contract that chose to register.
-To see how it works, read about [Contract Metadata](https://github.com/ethereum/wiki/wiki/Contract-metadata) or read the contract info deployment section of this document.
-
-```js
-// get the contract info for contract address to do manual verification
-var info = admin.contractInfo.get(address) // lookup, fetch, decode
-var source = info.source;
-var abiDef = info.abiDefinition
-```
-
-```js
-// verify an existing contract in blockchain (NOT IMPLEMENTED)
-admin.contractInfo.verify(address)
-```
-
-# NatSpec
-
-This section will further elaborate what you can do with contracts and transactions building on a protocol NatSpec. Solidity implements smart comments doxigen style which then can be used to generate various facades meta documents of the code. One such use case is to generate custom messages for transaction confirmation that clients can prompt users with.
-
-So we now extend the `multiply7` contract with a smart comment specifying a custom confirmation message (notice).
-
-```js
-contract test {
- /// @notice Will multiply `a` by 7.
- function multiply(uint a) returns(uint d) {
- return a * 7;
- }
-}
-```
-
-The comment has expressions in between backticks which are to be evaluated at the time the transaction confirmation message is presented to the user. The variables that refer to parameters of method calls then are instantiated in accordance with the actual transaction data sent by the user (or the user's dapp). NatSpec support for confirmation notices is fully implemented in `geth`. NatSpec relies on both the abi definition as well as the userDoc component to generate the proper confirmations. Therefore in order to access that, the contract needs to have registered its contract info as described above.
-
-Let us see a full example. As a very conscientious smart contract dev, you first create your contract and deploy according to the recommended steps above:
-
-```js
-source = "contract test {
- /// @notice Will multiply `a` by 7.
- function multiply(uint a) returns(uint d) {
- return a * 7;
- }
-}"
-contract = eth.compile.solidity(source)
-contentHash = admin.contractInfo.register(contract, "~/dapps/shared/contracts/test/info.json")
-// put it up on your favourite site:
-admin.contractInfo.registerUrl(contentHash, "http://dapphub.com/test/info.json")
-```
-
-For the purposes of a painless example just simply use the file url scheme (not exactly the cloud, but will show you how it works) without needing to deploy. `admin.contractInfo.registerUrl(contentHash, "file:///home/nirname/dapps/shared/contracts/test/info.json")`.
-
-Now you are done as a dev, so swap seats as it were and pretend that you are a user who is sending a transaction to the infamous multiply7 contract.
-
-You need to start the client with the `--natspec` flag to enable smart confirmations and contractInfo fetching. You can also set it on the console with `admin.contractInfo.start()` and `admin.contractInfo.stop()`.
-
-```
-geth --natspec --unlock primary console 2>> /tmp/eth.log
-```
-
-Now at the console type:
-
-```js
-// obtain the abi definition for your contract
-var info = admin.contractInfo.get(address)
-var abiDef = info.abiDefinition
-// instantiate a contract for transactions
-var Multiply7 = eth.contract(abiDef);
-var multiply7 = new Multiply7();
-```
-
-And now try to send an actual transaction:
-
-```js
-> multiply7.multiply.sendTransaction(6)
-NatSpec: Will multiply 6 by 7.
-Confirm? [Y/N] y
->
-```
-
-When this transaction gets included in a block, somewhere on a lucky miner's computer, 6 will get multiplied by 7, with the result ignored.
-
-```js
-// assume an existing unlocked primary account
-primary = eth.accounts[0];
-
-// mine 10 blocks to generate ether
-admin.miner.start();
-admin.debug.waitForBlocks(eth.blockNumber+10);
-admin.miner.stop() ;
-
-balance = web3.fromWei(eth.getBalance(primary), "ether");
-
-admin.contractInfo.newRegistry(primary);
-
-source = "contract test {\n" +
-" /// @notice will multiply `a` by 7.\n" +
-" function multiply(uint a) returns(uint d) {\n" +
-" return a * 7;\n" +
-" }\n" +
-"} ";
-
-contract = eth.compile.solidity(source);
-
-contractaddress = eth.sendTransaction({from: primary, data: contract.code});
-
-eth.getBlock("pending", true).transactions;
-
-admin.miner.start()
-// waits until block height is minimum the number given.
-// basically a sleep function on variable block units of time.
-
-admin.debug.waitForBlocks(eth.blockNumber+1);
-admin.miner.stop()
-
-code = eth.getCode(contractaddress);
-
-abiDef = JSON.parse('[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}]');
-Multiply7 = eth.contract(abiDef);
-multiply7 = new Multiply7(contractaddress);
-
-fortytwo = multiply7.multiply.call(6);
-console.log("multiply7.multiply.call(6) => "+fortytwo);
-multiply7.multiply.sendTransaction(6, {from: primary})
-
-admin.miner.start();
-admin.debug.waitForBlocks(eth.blockNumber+1);
-admin.miner.stop();
-
-filename = "/tmp/info.json";
-contenthash = admin.contractInfo.register(primary, contractaddress, contract, filename);
-
-admin.contractInfo.registerUrl(primary, contenthash, "file://"+filename);
-
-admin.miner.start();
-admin.debug.waitForBlocks(eth.blockNumber+1);
-admin.miner.stop();
-
-info = admin.contractInfo.get(contractaddress);
-
-admin.contractInfo.start();
-abiDef = JSON.parse('[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}]');
-Multiply7 = eth.contract(abiDef);
-multiply7 = new Multiply7(contractaddress);
-fortytwo = multiply7.multiply.sendTransaction(6, { from: primary });
-
-```
\ No newline at end of file
diff --git a/docs/_doc/Mobile_Account-management.md b/docs/_doc/Mobile_Account-management.md
deleted file mode 100644
index a21da03f3e..0000000000
--- a/docs/_doc/Mobile_Account-management.md
+++ /dev/null
@@ -1,199 +0,0 @@
----
-title: Mobile / Account management
----
-To provide Ethereum integration for your mobile applications, the very first thing you should be interested in doing is account management.
-
-Although all current leading Ethereum implementations provide account management built in, it is ill advised to keep accounts in any location that is shared between multiple applications and/or multiple people. The same way you do not entrust your ISP (who is after all your gateway into the internet) with your login credentials; you should not entrust an Ethereum node (who is your gateway into the Ethereum network) with your credentials either.
-
-The proper way to handle user accounts in your mobile applications is to do client side account management, everything self-contained within your own application. This way you can ensure as fine grained (or as coarse) access permissions to the sensitive data as deemed necessary, without relying on any third party application's functionality and/or vulnerabilities.
-
-To support this, `go-ethereum` provides a simple, yet thorough accounts library that gives you all the tools to do properly secured account management via encrypted keystores and passphrase protected accounts. You can leverage all the security of the `go-ethereum` crypto implementation while at the same time running everything in your own application.
-
-## Encrypted keystores
-
-Although handling your users' accounts locally on their own mobile device does provide certain security guarantees, access keys to Ethereum accounts should never lay around in clear-text form. As such, we provide an encrypted keystore that provides the proper security guarantees for you without requiring a thorough understanding from your part of the associated cryptographic primitives.
-
-The important thing to know when using the encrypted keystore is that the cryptographic primitives used within can operate either in *standard* or *light* mode. The former provides a higher level of security at the cost of increased computational burden and resource consumption:
-
- * *standard* needs 256MB memory and 1 second processing on a modern CPU to access a key
- * *light* needs 4MB memory and 100 millisecond processing on a modern CPU to access a key
-
-As such, *light* is more suitable for mobile applications, but you should be aware of the trade-offs nonetheless.
-
-*For those interested in the cryptographic and/or implementation details, the key-store uses the `secp256k1` elliptic curve as defined in the [Standards for Efficient Cryptography](http://www.secg.org/sec2-v2.pdf), implemented by the [`libsecp256k`](https://github.com/bitcoin-core/secp256k1) library and wrapped by [`github.com/ethereum/go-ethereum/accounts`](https://godoc.org/github.com/ethereum/go-ethereum/accounts). Accounts are stored on disk in the [Web3 Secret Storage](https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition) format.*
-
-### Keystores on Android (Java)
-
-The encrypted keystore on Android is implemented by the `KeyStore` class from the `org.ethereum.geth` package. The configuration constants (for the *standard* or *light* security modes described above) are located in the `Geth` abstract class, similarly from the `org.ethereum.geth` package. Hence to do client side account management on Android, you'll need to import two classes into your Java code:
-
-```java
-import org.ethereum.geth.Geth;
-import org.ethereum.geth.KeyStore;
-```
-
-Afterwards you can create a new encrypted keystore via:
-
-```java
-KeyStore ks = new KeyStore("/path/to/keystore", Geth.LightScryptN, Geth.LightScryptP);
-```
-
-The path to the keystore folder needs to be a location that is writable by the local mobile application but non-readable for other installed applications (for security reasons obviously), so we'd recommend placing it inside your app's data directory. If you are creating the `KeyStore` from within a class extending an Android object, you will most probably have access to the `Context.getFilesDir()` method via `this.getFilesDir()`, so you could set the keystore path to `this.getFilesDir() + "/keystore"`.
-
-The last two arguments of the `KeyStore` constructor are the crypto parameters defining how resource-intensive the keystore encryption should be. You can choose between `Geth.StandardScryptN, Geth.StandardScryptP`, `Geth.LightScryptN, Geth.LightScryptP` or specify your own numbers (please make sure you understand the underlying cryptography for this). We recommend using the *light* version.
-
-### Keystores on iOS (Swift 3)
-
-The encrypted keystore on iOS is implemented by the `GethKeyStore` class from the `Geth` framework. The configuration constants (for the *standard* or *light* security modes described above) are located in the same namespace as global variables. Hence to do client side account management on iOS, you'll need to import the framework into your Swift code:
-
-```swift
-import Geth
-```
-
-Afterwards you can create a new encrypted account manager via:
-
-```swift
-let ks = GethNewKeyStore("/path/to/keystore", GethLightScryptN, GethLightScryptP);
-```
-
-The path to the keystore folder needs to be a location that is writable by the local mobile application but non-readable for other installed applications (for security reasons obviously), so we'd recommend placing it inside your app's document directory. You should be able to retrieve the document directory via `let datadir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]`, so you could set the keystore path to `datadir + "/keystore"`.
-
-The last two arguments of the `GethNewKeyStore` factory method are the crypto parameters defining how resource-intensive the keystore encryption should be. You can choose between `GethStandardScryptN, GethStandardScryptP`, `GethLightScryptN, GethLightScryptP` or specify your own numbers (please make sure you understand the underlying cryptography for this). We recommend using the *light* version.
-
-## Account lifecycle
-
-Having created an encrypted keystore for your Ethereum accounts, you can use this for the entire account lifecycle requirements of your mobile application. This includes the basic functionality of creating new accounts and deleting existing ones; as well as the more advanced functionality of updating access credentials, exporting existing accounts, and importing them on another device.
-
-Although the keystore defines the encryption strength it uses to store your accounts, there is no global master password that can grant access to all of them. Rather each account is maintained individually, and stored on disk in its [encrypted format](https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition) individually, ensuring a much cleaner and stricter separation of credentials.
-
-This individuality however means that any operation requiring access to an account will need to provide the necessary authentication credentials for that particular account in the form of a passphrase:
-
- * When creating a new account, the caller must supply a passphrase to encrypt the account with. This passphrase will be required for any subsequent access, the lack of which will forever forfeit using the newly created account.
- * When deleting an existing account, the caller must supply a passphrase to verify ownership of the account. This isn't cryptographically necessary, rather a protective measure against accidental loss of accounts.
- * When updating an existing account, the caller must supply both current and new passphrases. After completing the operation, the account will not be accessible via the old passphrase any more.
- * When exporting an existing account, the caller must supply both the current passphrase to decrypt the account, as well as an export passphrase to re-encrypt it with before returning the key-file to the user. This is required to allow moving accounts between devices without sharing original credentials.
- * When importing a new account, the caller must supply both the encryption passphrase of the key-file being imported, as well as a new passhprase with which to store the account. This is required to allow storing account with different credentials than used for moving them around.
-
-*Please note, there is no recovery mechanisms for losing the passphrases. The cryptographic properties of the encrypted keystore (if using the provided parameters) guarantee that account credentials cannot be brute forced in any meaningful time.*
-
-### Accounts on Android (Java)
-
-An Ethereum account on Android is implemented by the `Account` class from the `org.ethereum.geth` package. Assuming we already have an instance of a `KeyStore` called `ks` from the previous section, we can easily execute all of the described lifecycle operations with a handful of function calls.
-
-```java
-// Create a new account with the specified encryption passphrase.
-Account newAcc = ksm.newAccount("Creation password");
-
-// Export the newly created account with a different passphrase. The returned
-// data from this method invocation is a JSON encoded, encrypted key-file.
-byte[] jsonAcc = ks.exportKey(newAcc, "Creation password", "Export password");
-
-// Update the passphrase on the account created above inside the local keystore.
-ks.updateAccount(newAcc, "Creation password", "Update password");
-
-// Delete the account updated above from the local keystore.
-ks.deleteAccount(newAcc, "Update password");
-
-// Import back the account we've exported (and then deleted) above with yet
-// again a fresh passphrase.
-Account impAcc = ks.importKey(jsonAcc, "Export password", "Import password");
-```
-
-*Although instances of `Account` can be used to access various information about specific Ethereum accounts, they do not contain any sensitive data (such as passphrases or private keys), rather act solely as identifiers for client code and the keystore.*
-
-### Accounts on iOS (Swift 3)
-
-An Ethereum account on iOS is implemented by the `GethAccount` class from the `Geth` framework. Assuming we already have an instance of a `GethKeyStore` called `ks` from the previous section, we can easily execute all of the described lifecycle operations with a handful of function calls.
-
-```swift
-// Create a new account with the specified encryption passphrase.
-let newAcc = try! ks?.newAccount("Creation password")
-
-// Export the newly created account with a different passphrase. The returned
-// data from this method invocation is a JSON encoded, encrypted key-file.
-let jsonKey = try! ks?.exportKey(newAcc!, passphrase: "Creation password", newPassphrase: "Export password")
-
-// Update the passphrase on the account created above inside the local keystore.
-try! ks?.update(newAcc, passphrase: "Creation password", newPassphrase: "Update password")
-
-// Delete the account updated above from the local keystore.
-try! ks?.delete(newAcc, passphrase: "Update password")
-
-// Import back the account we've exported (and then deleted) above with yet
-// again a fresh passphrase.
-let impAcc = try! ks?.importKey(jsonKey, passphrase: "Export password", newPassphrase: "Import password")
-```
-
-*Although instances of `GethAccount` can be used to access various information about specific Ethereum accounts, they do not contain any sensitive data (such as passphrases or private keys), rather act solely as identifiers for client code and the keystore.*
-
-## Signing authorization
-
-As mentioned above, account objects do not hold the sensitive private keys of the associated Ethereum accounts, but are merely placeholders to identify the cryptographic keys with. All operations that require authorization (e.g. transaction signing) are performed by the account manager after granting it access to the private keys.
-
-There are a few different ways one can authorize the account manager to execute signing operations, each having its advantages and drawbacks. Since the different methods have wildly different security guarantees, it is essential to be clear on how each works:
-
- * **Single authorization**: The simplest way to sign a transaction via the keystore is to provide the passphrase of the account every time something needs to be signed, which will ephemerally decrypt the private key, execute the signing operation and immediately throw away the decrypted key. The drawbacks are that the passphrase needs to be queried from the user every time, which can become annoying if done frequently; or the application needs to keep the passphrase in memory, which can have security consequences if not done properly; and depending on the keystore's configured strength, constantly decrypting keys can result in non-negligible resource requirements.
- * **Multiple authorizations**: A more complex way of signing transactions via the keystore is to unlock the account via its passphrase once, and allow the account manager to cache the decrypted private key, enabling all subsequent signing requests to complete without the passphrase. The lifetime of the cached private key may be managed manually (by explicitly locking the account back up) or automatically (by providing a timeout during unlock). This mechanism is useful for scenarios where the user may need to sign many transactions or the application would need to do so without requiring user input. The crucial aspect to remember is that **anyone with access to the account manager can sign transactions while a particular account is unlocked** (e.g. device left unattended; application running untrusted code).
-
-*Note, creating transactions is out of scope here, so the remainder of this section will assume we already have a transaction to sign, and will focus only on creating an authorized version of it. Creating an actually meaningful transaction will be covered later.*
-
-### Signing on Android (Java)
-
-Assuming we already have an instance of a `KeyStore` called `ks` from the previous sections, we can create a new account to sign transactions with via it's already demonstrated `newAccount` method; and to avoid going into transaction creation for now, we can hard-code a random transaction to sign instead.
-
-```java
-// Create a new account to sign transactions with
-Account signer = ks.newAccount("Signer password");
-Transaction tx = new Transaction(
- 1, new Address("0x0000000000000000000000000000000000000000"),
- new BigInt(0), new BigInt(0), new BigInt(1), null); // Random empty transaction
-BigInt chain = new BigInt(1); // Chain identifier of the main net
-```
-
-With the boilerplate out of the way, we can now sign transaction using the authorization mechanisms described above:
-
-```java
-// Sign a transaction with a single authorization
-Transaction signed = ks.signTxPassphrase(signer, "Signer password", tx, chain);
-
-// Sign a transaction with multiple manually cancelled authorizations
-ks.unlock(signer, "Signer password");
-signed = ks.signTx(signer, tx, chain);
-ks.lock(signer.getAddress());
-
-// Sign a transaction with multiple automatically cancelled authorizations
-ks.timedUnlock(signer, "Signer password", 1000000000);
-signed = ks.signTx(signer, tx, chain);
-```
-
-### Signing on iOS (Swift 3)
-
-Assuming we already have an instance of a `GethKeyStore` called `ks` from the previous sections, we can create a new account to sign transactions with via it's already demonstrated `newAccount` method; and to avoid going into transaction creation for now, we can hard-code a random transaction to sign instead.
-
-```swift
-// Create a new account to sign transactions with
-var error: NSError?
-let signer = try! ks?.newAccount("Signer password")
-
-let to = GethNewAddressFromHex("0x0000000000000000000000000000000000000000", &error)
-let tx = GethNewTransaction(1, to, GethNewBigInt(0), GethNewBigInt(0), GethNewBigInt(0), nil) // Random empty transaction
-let chain = GethNewBigInt(1) // Chain identifier of the main net
-```
-
-*Note, although Swift usually rewrites `NSError` returns to throws, this particular instance seems to have been missed for some reason (possibly due to it being a constructor). It will be fixed in a later version of the iOS bindings when the appropriate fixed are implemented upstream in the `gomobile` project.*
-
-With the boilerplate out of the way, we can now sign transaction using the authorization methods described above:
-
-```swift
-// Sign a transaction with a single authorization
-var signed = try! ks?.signTxPassphrase(signer, passphrase: "Signer password", tx: tx, chainID: chain)
-
-// Sign a transaction with multiple manually cancelled authorizations
-try! ks?.unlock(signer, passphrase: "Signer password")
-signed = try! ks?.signTx(signer, tx: tx, chainID: chain)
-try! ks?.lock(signer?.getAddress())
-
-// Sign a transaction with multiple automatically cancelled authorizations
-try! ks?.timedUnlock(signer, passphrase: "Signer password", timeout: 1000000000)
-signed = try! ks?.signTx(signer, tx: tx, chainID: chain)
-```
-
diff --git a/docs/_doc/Mobile_Introduction.md b/docs/_doc/Mobile_Introduction.md
deleted file mode 100644
index 70ca707a0b..0000000000
--- a/docs/_doc/Mobile_Introduction.md
+++ /dev/null
@@ -1,125 +0,0 @@
----
-title: Mobile / Introduction
----
-The Ethereum blockchain along with its two extension protocols Whisper and Swarm was originally conceptualized to become the supporting pillar of web3, providing the consensus, messaging and storage backbone for a new generation of distributed (actually, decentralized) applications called DApps.
-
-The first incarnation towards this dream of web3 was a command line client providing an RPC interface into the peer-to-peer protocols. The client was soon enough extended with a web-browser-like graphical user interface, permitting developers to write DApps based on the tried and proven HTML/CSS/JS technologies.
-
-As many DApps have more complex requirements than what a browser environment can handle, it became apparent that providing programmatic access to the web3 pillars would open the door towards a new class of applications. As such, the second incarnation of the web3 dream is to open up all our technologies for other projects as reusable components.
-
-Starting with the 1.5 release family of `go-ethereum`, we transitioned away from providing only a full blown Ethereum client and started shipping official Go packages that could be embedded into third party desktop and server applications. It took only a small leap from here to begin porting our code to mobile platforms.
-
-## Quick overview
-
-Similarly to our reusable Go libraries, the mobile wrappers also focus on four main usage areas:
-
-- Simplified client side account management
-- Remote node interfacing via different transports
-- Contract interactions through auto-generated bindings
-- In-process Ethereum, Whisper and Swarm peer-to-peer node
-
-You can watch a quick overview about these in Peter's (@karalabe) talk titled "Import Geth: Ethereum from Go and beyond", presented at the Ethereum Devcon2 developer conference in September, 2016 (Shanghai). Slides are [available here](https://ethereum.karalabe.com/talks/2016-devcon.html).
-
-[![Peter's Devcon2 talk](https://img.youtube.com/vi/R0Ia1U9Gxjg/0.jpg)](https://www.youtube.com/watch?v=R0Ia1U9Gxjg)
-
-## Library bundles
-
-The `go-ethereum` mobile library is distributed either as an Android `.aar` archive (containing binaries for `arm-7`, `arm64`, `x86` and `x64`); or as an iOS XCode framework (containing binaries for `arm-7`, `arm64` and `x86`). We do not provide library bundles for Windows phone the moment.
-
-### Android archive
-
-The simplest way to use `go-ethereum` in your Android project is through a Maven dependency. We provide bundles of all our stable releases (starting from v1.5.0) through Maven Central, and also provide the latest develop bundle through the Sonatype OSS repository.
-
-#### Stable dependency (Maven Central)
-
-To add an Android dependency to the **stable** library release of `go-ethereum`, you'll need to ensure that the Maven Central repository is enabled in your Android project, and that the `go-ethereum` code is listed as a required dependency of your application. You can do both of these by editing the `build.gradle` script in your Android app's folder:
-
-```gradle
-repositories {
- mavenCentral()
-}
-
-dependencies {
- // All your previous dependencies
- compile 'org.ethereum:geth:1.5.2' // Change the version to the latest release
-}
-```
-
-#### Develop dependency (Sonatype)
-
-To add an Android dependency to the current **develop** version of `go-ethereum`, you'll need to ensure that the Sonatype snapshot repository is enabled in your Android project, and that the `go-ethereum` code is listed as a required `SNAPSHOT` dependency of your application. You can do both of these by editing the `build.gradle` script in your Android app's folder:
-
-```gradle
-repositories {
- maven {
- url "https://oss.sonatype.org/content/groups/public"
- }
-}
-
-dependencies {
- // All your previous dependencies
- compile 'org.ethereum:geth:1.5.3-SNAPSHOT' // Change the version to the latest release
-}
-```
-
-#### Custom dependency
-
-If you prefer not to depend on Maven Central or Sonatype; or would like to access an older develop build not available any more as an online dependency, you can download any bundle directly from [our website](https://geth.ethereum.org/downloads/) and insert it into your project in Android Studio via `File -> New -> New module... -> Import .JAR/.AAR Package`.
-
-You will also need to configure `gradle` to link the mobile library bundle to your application. This can be done by adding a new entry to the `dependencies` section of your `build.gradle` script, pointing it to the module you just added (named `geth` by default).
-
-```gradle
-dependencies {
- // All your previous dependencies
- compile project(':geth')
-}
-```
-
-#### Manual builds
-
-Lastly, if you would like to make modifications to the `go-ethereum` mobile code and/or build it yourself locally instead of downloading a pre-built bundle, you can do so using a `make` command. This will create an Android archive called `geth.aar` in the `build/bin` folder that you can import into your Android Studio as described above.
-
-```bash
-$ make android
-[...]
-Done building.
-Import "build/bin/geth.aar" to use the library.
-```
-
-### iOS framework
-
-The simplest way to use `go-ethereum` in your iOS project is through a [CocoaPods](https://cocoapods.org/) dependency. We provide bundles of all our stable releases (starting from v1.5.3) and also latest develop versions.
-
-#### Automatic dependency
-
-To add an iOS dependency to the current stable or latest develop version of `go-ethereum`, you'll need to ensure that your iOS XCode project is configured to use CocoaPods. Detailing that is out of scope in this document, but you can find a guide in the upstream [Using CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html) page. Afterwards you can edit your `Podfile` to list `go-ethereum` as a dependency:
-
-```ruby
-target 'MyApp' do
- # All your previous dependencies
- pod 'Geth', '1.5.4' # Change the version to the latest release
-end
-```
-
-Alternatively, if you'd like to use the latest develop version, replace the package version `1.5.4` with `~> 1.5.5-unstable` to switch to pre-releases and to always pull in the latest bundle from a particular release family.
-
-#### Custom dependency
-
-If you prefer not to depend on CocoaPods; or would like to access an older develop build not available any more as an online dependency, you can download any bundle directly from [our website](https://geth.ethereum.org/downloads/) and insert it into your project in XCode via `Project Settings -> Build Phases -> Link Binary With Libraries`.
-
-Do not forget to extract the framework from the compressed `.tar.gz` archive. You can do that either using a GUI tool or from the command line via (replace the archive with your downloaded file):
-
-```
-tar -zxvf geth-ios-all-1.5.3-unstable-e05d35e6.tar.gz
-```
-
-#### Manual builds
-
-Lastly, if you would like to make modifications to the `go-ethereum` mobile code and/or build it yourself locally instead of downloading a pre-built bundle, you can do so using a `make` command. This will create an iOS XCode framework called `Geth.framework` in the `build/bin` folder that you can import into XCode as described above.
-
-```bash
-$ make ios
-[...]
-Done building.
-Import "build/bin/Geth.framework" to use the library.
-```
diff --git a/docs/_doc/Native_Account-management.md b/docs/_doc/Native_Account-management.md
deleted file mode 100644
index cd5b74bf31..0000000000
--- a/docs/_doc/Native_Account-management.md
+++ /dev/null
@@ -1,122 +0,0 @@
----
-title: Native / Account management
----
-To provide Ethereum integration for your native applications, the very first thing you should be interested in doing is account management.
-
-Although all current leading Ethereum implementations provide account management built in, it is ill advised to keep accounts in any location that is shared between multiple applications and/or multiple people. The same way you do not entrust your ISP (who is after all your gateway into the internet) with your login credentials; you should not entrust an Ethereum node (who is your gateway into the Ethereum network) with your credentials either.
-
-The proper way to handle user accounts in your native applications is to do client side account management, everything self-contained within your own application. This way you can ensure as fine grained (or as coarse) access permissions to the sensitive data as deemed necessary, without relying on any third party application's functionality and/or vulnerabilities.
-
-To support this, `go-ethereum` provides a simple, yet thorough accounts package that gives you all the tools to do properly secured account management via encrypted keystores and passphrase protected accounts. You can leverage all the security of the `go-ethereum` crypto implementation while at the same time running everything in your own application.
-
-## Encrypted keystores
-
-Although handling accounts locally to an application does provide certain security guarantees, access keys to Ethereum accounts should never lay around in clear-text form. As such, we provide an encrypted keystore that provides the proper security guarantees for you without requiring a thorough understanding from your part of the associated cryptographic primitives.
-
-The important thing to know when using the encrypted keystore is that the cryptographic primitives used within can operate either in *standard* or *light* mode. The former provides a higher level of security at the cost of increased computational burden and resource consumption:
-
- * *standard* needs 256MB memory and 1 second processing on a modern CPU to access a key
- * *light* needs 4MB memory and 100 millisecond processing on a modern CPU to access a key
-
-As such, *standard* is more suitable for native applications, but you should be aware of the trade-offs nonetheless in case you you're targeting more resource constrained environments.
-
-*For those interested in the cryptographic and/or implementation details, the key-store uses the `secp256k1` elliptic curve as defined in the [Standards for Efficient Cryptography](http://www.secg.org/sec2-v2.pdf), implemented by the [`libsecp256k`](https://github.com/bitcoin-core/secp256k1) library and wrapped by [`github.com/ethereum/go-ethereum/accounts`](https://godoc.org/github.com/ethereum/go-ethereum/accounts). Accounts are stored on disk in the [Web3 Secret Storage](https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition) format.*
-
-### Keystores from Go
-
-The encrypted keystore is implemented by the [`accounts.Manager`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Manager) struct from the [`github.com/ethereum/go-ethereum/accounts`](https://godoc.org/github.com/ethereum/go-ethereum/accounts) package, which also contains the configuration constants for the *standard* or *light* security modes described above. Hence to do client side account management from Go, you'll need to import only the `accounts` package into your code:
-
-```go
-import "github.com/ethereum/go-ethereum/accounts"
-```
-
-Afterwards you can create a new encrypted account manager via:
-
-```go
-am := accounts.NewManager("/path/to/keystore", accounts.StandardScryptN, accounts.StandardScryptP);
-```
-
-The path to the keystore folder needs to be a location that is writable by the local user but non-readable for other system users (for security reasons obviously), so we'd recommend placing it either inside your user's home directory or even more locked down for backend applications.
-
-The last two arguments of [`accounts.NewManager`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#NewManager) are the crypto parameters defining how resource-intensive the keystore encryption should be. You can choose between [`accounts.StandardScryptN, accounts.StandardScryptP`, `accounts.LightScryptN, accounts.LightScryptP`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#pkg-constants) or specify your own numbers (please make sure you understand the underlying cryptography for this). We recommend using the *standard* version.
-
-## Account lifecycle
-
-Having created an encrypted keystore for your Ethereum accounts, you can use this account manager for the entire account lifecycle requirements of your native application. This includes the basic functionality of creating new accounts and deleting existing ones; as well as the more advanced functionality of updating access credentials, exporting existing accounts, and importing them on another device.
-
-Although the keystore defines the encryption strength it uses to store your accounts, there is no global master password that can grant access to all of them. Rather each account is maintained individually, and stored on disk in its [encrypted format](https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition) individually, ensuring a much cleaner and stricter separation of credentials.
-
-This individuality however means that any operation requiring access to an account will need to provide the necessary authentication credentials for that particular account in the form of a passphrase:
-
- * When creating a new account, the caller must supply a passphrase to encrypt the account with. This passphrase will be required for any subsequent access, the lack of which will forever forfeit using the newly created account.
- * When deleting an existing account, the caller must supply a passphrase to verify ownership of the account. This isn't cryptographically necessary, rather a protective measure against accidental loss of accounts.
- * When updating an existing account, the caller must supply both current and new passphrases. After completing the operation, the account will not be accessible via the old passphrase any more.
- * When exporting an existing account, the caller must supply both the current passphrase to decrypt the account, as well as an export passphrase to re-encrypt it with before returning the key-file to the user. This is required to allow moving accounts between machines and applications without sharing original credentials.
- * When importing a new account, the caller must supply both the encryption passphrase of the key-file being imported, as well as a new passhprase with which to store the account. This is required to allow storing account with different credentials than used for moving them around.
-
-*Please note, there is no recovery mechanisms for losing the passphrases. The cryptographic properties of the encrypted keystore (if using the provided parameters) guarantee that account credentials cannot be brute forced in any meaningful time.*
-
-### Accounts from Go
-
-An Ethereum account is implemented by the [`accounts.Account`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Account) struct from the [`github.com/ethereum/go-ethereum/accounts`](https://godoc.org/github.com/ethereum/go-ethereum/accounts) package. Assuming we already have an instance of an [`accounts.Manager`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Manager) called `am` from the previous section, we can easily execute all of the described lifecycle operations with a handful of function calls (error handling omitted).
-
-```go
-// Create a new account with the specified encryption passphrase.
-newAcc, _ := am.NewAccount("Creation password");
-
-// Export the newly created account with a different passphrase. The returned
-// data from this method invocation is a JSON encoded, encrypted key-file.
-jsonAcc, _ := am.Export(newAcc, "Creation password", "Export password");
-
-// Update the passphrase on the account created above inside the local keystore.
-am.Update(newAcc, "Creation password", "Update password");
-
-// Delete the account updated above from the local keystore.
-am.Delete(newAcc, "Update password");
-
-// Import back the account we've exported (and then deleted) above with yet
-// again a fresh passphrase.
-impAcc, _ := am.Import(jsonAcc, "Export password", "Import password");
-```
-
-*Although instances of [`accounts.Account`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Account) can be used to access various information about specific Ethereum accounts, they do not contain any sensitive data (such as passphrases or private keys), rather act solely as identifiers for client code and the keystore.*
-
-## Signing authorization
-
-As mentioned above, account objects do not hold the sensitive private keys of the associated Ethereum accounts, but are merely placeholders to identify the cryptographic keys with. All operations that require authorization (e.g. transaction signing) are performed by the account manager after granting it access to the private keys.
-
-There are a few different ways one can authorize the account manager to execute signing operations, each having its advantages and drawbacks. Since the different methods have wildly different security guarantees, it is essential to be clear on how each works:
-
- * **Single authorization**: The simplest way to sign a transaction via the account manager is to provide the passphrase of the account every time something needs to be signed, which will ephemerally decrypt the private key, execute the signing operation and immediately throw away the decrypted key. The drawbacks are that the passphrase needs to be queried from the user every time, which can become annoying if done frequently; or the application needs to keep the passphrase in memory, which can have security consequences if not done properly; and depending on the keystore's configured strength, constantly decrypting keys can result in non-negligible resource requirements.
- * **Multiple authorizations**: A more complex way of signing transactions via the account manager is to unlock the account via its passphrase once, and allow the account manager to cache the decrypted private key, enabling all subsequent signing requests to complete without the passphrase. The lifetime of the cached private key may be managed manually (by explicitly locking the account back up) or automatically (by providing a timeout during unlock). This mechanism is useful for scenarios where the user may need to sign many transactions or the application would need to do so without requiring user input. The crucial aspect to remember is that **anyone with access to the account manager can sign transactions while a particular account is unlocked** (e.g. application running untrusted code).
-
-*Note, creating transactions is out of scope here, so the remainder of this section will assume we already have a transaction hash to sign, and will focus only on creating a cryptographic signature authorizing it. Creating an actual transaction and injecting the authorization signature into it will be covered later.*
-
-### Signing from Go
-
-Assuming we already have an instance of an [`accounts.Manager`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Manager) called `am` from the previous sections, we can create a new account to sign transactions with via it's already demonstrated [`NewAccount`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Manager.NewAccount) method; and to avoid going into transaction creation for now, we can hard-code a random [`common.Hash`](https://godoc.org/github.com/ethereum/go-ethereum/common#Hash) to sign instead.
-
-```go
-// Create a new account to sign transactions with
-signer, _ := am.NewAccount("Signer password");
-txHash := common.HexToHash("0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef");
-```
-
-With the boilerplate out of the way, we can now sign transaction using the authorization mechanisms described above:
-
-```go
-// Sign a transaction with a single authorization
-signature, _ := am.SignWithPassphrase(signer, "Signer password", txHash.Bytes());
-
-// Sign a transaction with multiple manually cancelled authorizations
-am.Unlock(signer, "Signer password");
-signature, _ = am.Sign(signer.Address, txHash.Bytes());
-am.Lock(signer.Address);
-
-// Sign a transaction with multiple automatically cancelled authorizations
-am.TimedUnlock(signer, "Signer password", time.Second);
-signature, _ = am.Sign(signer.Address, txHash.Bytes());
-```
-
-You may wonder why [`SignWithPassphrase`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Manager.SignWithPassphrase) takes an [`accounts.Account`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Account) as the signer, whereas [`Sign`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Manager.Sign) takes only a [`common.Address`](https://godoc.org/github.com/ethereum/go-ethereum/common#Address). The reason is that an [`accounts.Account`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Account) object may also contain a custom key-path, allowing [`SignWithPassphrase`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Manager.SignWithPassphrase) to sign using accounts outside of the keystore; however [`Sign`](https://godoc.org/github.com/ethereum/go-ethereum/accounts#Manager.Sign) relies on accounts already unlocked within the keystore, so it cannot specify custom paths.
-
diff --git a/docs/_doc/Native_Introduction.md b/docs/_doc/Native_Introduction.md
deleted file mode 100644
index 866abe19ab..0000000000
--- a/docs/_doc/Native_Introduction.md
+++ /dev/null
@@ -1,43 +0,0 @@
----
-title: Native / Introduction
----
-The Ethereum blockchain along with its two extension protocols Whisper and Swarm was originally conceptualized to become the supporting pillar of web3, providing the consensus, messaging and storage backbone for a new generation of distributed (actually, decentralized) applications called DApps.
-
-The first incarnation towards this dream of web3 was a command line client providing an RPC interface into the peer-to-peer protocols. The client was soon enough extended with a web-browser-like graphical user interface, permitting developers to write DApps based on the tried and proven HTML/CSS/JS technologies.
-
-As many DApps have more complex requirements than what a browser environment can handle, it became apparent that providing programmatic access to the web3 pillars would open the door towards a new class of applications. As such, the second incarnation of the web3 dream is to open up all our technologies for other projects as reusable components.
-
-Starting with the 1.5 release family of `go-ethereum`, we transitioned away from providing only a full blown Ethereum client and started shipping official Go packages that could be embedded into third party desktop and server applications.
-
-*Note, this guide will assume you are familiar with Go development. It will make no attempts to cover general topics about Go project layouts, import paths or any other standard methodologies. If you are new to Go, consider reading its [getting started guides](https://github.com/golang/go/wiki#getting-started-with-go) first.*
-
-## Quick overview
-
-Our reusable Go libraries focus on four main usage areas:
-
-- Simplified client side account management
-- Remote node interfacing via different transports
-- Contract interactions through auto-generated bindings
-- In-process Ethereum, Whisper and Swarm peer-to-peer node
-
-You can watch a quick overview about these in Peter's (@karalabe) talk titled "Import Geth: Ethereum from Go and beyond", presented at the Ethereum Devcon2 developer conference in September, 2016 (Shanghai). Slides are [available here](https://ethereum.karalabe.com/talks/2016-devcon.html).
-
-[![Peter's Devcon2 talk](https://img.youtube.com/vi/R0Ia1U9Gxjg/0.jpg)](https://www.youtube.com/watch?v=R0Ia1U9Gxjg)
-
-## Go packages
-
-The `go-ethereum` library is distributed as a collection of standard Go packages straight from our GitHub repository. The packages can be used directly via the official Go toolkit, without needing any third party tools. External dependencies are vendored locally into `vendor`, ensuring both self-containment as well as code stability. If you reuse `go-ethereum` in your own project, please follow these best practices and vendor it yourself too to avoid any accidental API breakages!
-
-The canonical import path for `go-ethereum` is `github.com/ethereum/go-ethereum`, with all packages residing underneath. Although there are [quite a number](https://godoc.org/github.com/ethereum/go-ethereum#pkg-subdirectories) of them, you'll only need to care about a limited subset, each of which will be properly introduced in their relevant section.
-
-You can download all our packages via:
-
-```
-$ go get -d github.com/ethereum/go-ethereum/...
-```
-
-You may also need Go's original context package. Although this was moved into the official Go SDK in Go 1.7, `go-ethereum` will depend on the original `golang.org/x/net/context` package until we officially drop support for Go 1.5 and Go 1.6.
-
-```
-$ go get -u golang.org/x/net/context
-```
diff --git a/docs/_doc/Provisional-JS-API.md b/docs/_doc/Provisional-JS-API.md
deleted file mode 100644
index c679680daa..0000000000
--- a/docs/_doc/Provisional-JS-API.md
+++ /dev/null
@@ -1,45 +0,0 @@
----
-title: Provisional JS API
----
-The *provisional* JavaScript API is a purposed API for all things JavaScript. JavaScript technologies can be embedded within Qt(QML) technologies, local web and remote web and therefor the purposed API is written in a ASYNC fashion so that it may be used across all implementations. Hereby it should be known that all functions, unless explicitly specified, take a callback as last function argument which will be called when the operation has been completed.
-
-Please note that the provisional JavaScript API tries to leverage existing JS idioms as much as possible.
-
-## General API
-
-* `getBlock (number or string)`
- Retrieves a block by either the address or the number. If supplied with a string it will assume address, number otherwise.
-* `transact (sec, recipient, value, gas, gas price, data)`
- Creates a new transaction using your current key.
-* `create (sec, value, gas, gas price, init, body)`
- Creates a new contract using your current key.
-* `getKey (none)`
- Retrieves your current key in hex format.
-* `getStorage (object address, storage address)`
- Retrieves the storage address of the given object.
-* `getBalance (object address)`
- Retrieves the balance at the current address
-* `watch (string [, string])`
- Watches for changes on a specific address' state object such as state root changes or value changes.
-* `disconnect (string [, string])`
- Disconnects from a previous `watched` address.
-
-## Events
-
-The provisional JavaScript API exposes certain events through a basic eventing mechanism inspired by jQuery.
-
-* `on (event)`
- Subscribe to event which will be called whenever an event of type is received.
-* `off (event)`
- Unsubscribe to the given event
-* `trigger (event, data)`
- Trigger event of type with the given data. **note:** This function does not take a callback function.
-
-### Event Types
-
-All events are written in camel cased style beginning with a lowercase letter. Subevents are denoted by a colon `:`.
-
-* `block:new`
- Fired when a new valid block has been found on the wire. The attached value of this call is a block.
-* `object:changed`
- Fired when a watched address, specified through `watch`, changes in value.
\ No newline at end of file
diff --git a/docs/_doc/Setting-up-monitoring-on-local-cluster.md b/docs/_doc/Setting-up-monitoring-on-local-cluster.md
deleted file mode 100644
index 866d556c63..0000000000
--- a/docs/_doc/Setting-up-monitoring-on-local-cluster.md
+++ /dev/null
@@ -1,57 +0,0 @@
----
-title: Setting up monitoring on local cluster
----
-This page describes how to set up a monitoring site for your private network. It builds upon [this page](setting-up-private-network-or-local-cluster) and assumes you've created a local cluster using [this script (gethcluster.sh)](https://github.com/ethersphere/eth-utils).
-
-The monitoring system consists of two components:
-
-1. **eth-netstats** - the monitoring site which lists the nodes.
-2. **eth-net-intelligence-api** - these are processes that communicate with the ethereum client using RPC and push the data to the monitoring site via websockets.
-
-#Monitoring site
-Clone the repo and install dependencies:
-
- git clone https://github.com/cubedro/eth-netstats
- cd eth-netstats
- npm install
-
-Then choose a secret and start the app:
-
- WS_SECRET= npm start
-
-You can now access the (empty) monitoring site at `http://localhost:3000`.
-
-You can also choose a different port:
-
- PORT= WS_SECRET= npm start
-
-#Client-side information relays
-These processes will relay the information from each of your cluster nodes to the monitoring site using websockets.
-
-Clone the repo, install dependencies and make sure you have pm2 installed:
-
- git clone https://github.com/cubedro/eth-net-intelligence-api
- cd eth-net-intelligence-api
- npm install
- sudo npm install -g pm2
-
-Now, use [this script (netstatconf.sh)](https://github.com/ethersphere/eth-utils) to create an `app.json` suitable for pm2.
-
-Usage:
-
- bash netstatconf.sh
-
-- `number_of_clusters` is the number of nodes in the cluster.
-- `name_prefix` is a prefix for the node names as will appear in the listing.
-- `ws_server` is the eth-netstats server. Make sure you write the full URL, for example: http://localhost:3000.
-- `ws_secret` is the eth-netstats secret.
-
-For example:
-
- bash netstatconf.sh 5 mynode http://localhost:3000 big-secret > app.json
-
-Run the script and copy the resulting `app.json` into the `eth-net-intelligence-api` directory. Afterwards, `cd` into `eth-net-intelligence-api` and run the relays using `pm2 start app.json`. To stop the relays, you can use `pm2 delete app.json`.
-
-**NOTE**: The script assumes the nodes have RPC ports 8101, 8102, ... . If that's not the case, edit app.json and change it accordingly for each peer.
-
-At this point, open `http://localhost:3000` and your monitoring site should monitor all your nodes!
\ No newline at end of file
diff --git a/docs/_doc/Setting-up-private-network-or-local-cluster.md b/docs/_doc/Setting-up-private-network-or-local-cluster.md
deleted file mode 100644
index 2488c4f509..0000000000
--- a/docs/_doc/Setting-up-private-network-or-local-cluster.md
+++ /dev/null
@@ -1,119 +0,0 @@
----
-title: Setting up private network or local cluster
----
-This page describes how to set up a local cluster of nodes, advise how to make it private, and how to hook up your nodes on the eth-netstat network monitoring app.
-A fully controlled ethereum network is useful as a backend for network integration testing (core developers working on issues related to networking/blockchain synching/message propagation, etc or DAPP developers testing multi-block and multi-user scenarios).
-
-We assume you are able to build `geth` following the [build instructions](../install-and-build/build-from-source)
-
-## Setting up multiple nodes
-
-In order to run multiple ethereum nodes locally, you have to make sure:
-- each instance has a separate data directory (`--datadir`)
-- each instance runs on a different port (both eth and rpc) (`--port and --rpcport`)
-- in case of a cluster the instances must know about each other
-- the ipc endpoint is unique or the ipc interface is disabled (`--ipcpath or --ipcdisable`)
-
-You start the first node (let's make port explicit and disable ipc interface)
-```bash
-geth --datadir="/tmp/eth/60/01" -verbosity 6 --ipcdisable --port 30301 --rpcport 8101 console 2>> /tmp/eth/60/01.log
-```
-
-We started the node with the console, so that we can grab the enode url for instance:
-
-```
-> admin.nodeInfo.enode
-enode://8c544b4a07da02a9ee024def6f3ba24b2747272b64e16ec5dd6b17b55992f8980b77938155169d9d33807e501729ecb42f5c0a61018898c32799ced152e9f0d7@9[::]:30301
-```
-
-`[::]` will be parsed as localhost (`127.0.0.1`). If your nodes are on a local network check each individual host machine and find your ip with `ifconfig` (on Linux and MacOS):
-
-```bash
-$ ifconfig|grep netmask|awk '{print $2}'
-127.0.0.1
-192.168.1.97
-```
-
-If your peers are not on the local network, you need to know your external IP address (use a service) to construct the enode url.
-
-Now you can launch a second node with:
-
-```bash
-geth --datadir="/tmp/eth/60/02" --verbosity 6 --ipcdisable --port 30302 --rpcport 8102 console 2>> /tmp/eth/60/02.log
-```
-
-If you want to connect this instance to the previously started node you can add it as a peer from the console with `admin.addPeer(enodeUrlOfFirstInstance)`.
-
-You can test the connection by typing in geth console:
-
-```javascript
-> net.listening
-true
-> net.peerCount
-1
-> admin.peers
-...
-```
-
-## Local cluster
-
-As an extention of the above, you can spawn a local cluster of nodes easily. It can also be scripted including account creation which is needed for mining.
-See [`gethcluster.sh`](https://github.com/ethersphere/eth-utils) script, and the README there for usage and examples.
-
-## Private network
-
-See [[the Private Network Page|Private network]] for more information.
-
-### Setup bootnode
-
-The first time a node connects to the network it uses one of the predefined [bootnodes](https://github.com/ethereum/go-ethereum/blob/master/params/bootnodes.go). Through these bootnodes a node can join the network and find other nodes. In the case of a private cluster these predefined bootnodes are not of much use. Therefore go-ethereum offers a bootnode implementation that can be configured and run in your private network.
-
-It can be run through the command.
-```
-> bootnode
-Fatal: Use -nodekey or -nodekeyhex to specify a private key
-```
-
-As can be seen the bootnode asks for a key. Each ethereum node, including a bootnode is identified by an enode identifier. These identifiers are derived from a key. Therefore you will need to give the bootnode such key. Since we currently don't have one we can instruct the bootnode to generate a key (and store it in a file) before it starts.
-
-```
-> bootnode -genkey bootnode.key
-I0216 09:53:08.076155 p2p/discover/udp.go:227] Listening, enode://890b6b5367ef6072455fedbd7a24ebac239d442b18c5ab9d26f58a349dad35ee5783a0dd543e4f454fed22db9772efe28a3ed6f21e75674ef6203e47803da682@[::]:30301
-```
-
-(exit with CTRL-C)
-
-The stored key can be seen with:
-```
-> cat bootnode.key
-dc90f8f7324f1cc7ba52c4077721c939f98a628ed17e51266d01c9cd0294033a
-```
-
-To instruct geth nodes to use our own bootnode(s) use the `--bootnodes` flag. This is a comma separated list of bootnode enode identifiers.
-
-```
-geth --bootnodes "enode://890b6b5367ef6072455fedbd7a24ebac239d442b18c5ab9d26f58a349dad35ee5783a0dd543e4f454fed22db9772efe28a3ed6f21e75674ef6203e47803da682@[::]:30301"
-```
-(what [::] means is explained previously)
-
-Since it is convenient to start the bootnode each time with the same enode we can give the bootnode program the just generated key on the next time it is started.
-
-```
-bootnode -nodekey bootnode.key
-I0216 10:01:19.125600 p2p/discover/udp.go:227] Listening, enode://890b6b5367ef6072455fedbd7a24ebac239d442b18c5ab9d26f58a349dad35ee5783a0dd543e4f454fed22db9772efe28a3ed6f21e75674ef6203e47803da682@[::]:30301
-```
-
-or
-
-```
-bootnode -nodekeyhex dc90f8f7324f1cc7ba52c4077721c939f98a628ed17e51266d01c9cd0294033a
-I0216 10:01:40.094089 p2p/discover/udp.go:227] Listening, enode://890b6b5367ef6072455fedbd7a24ebac239d442b18c5ab9d26f58a349dad35ee5783a0dd543e4f454fed22db9772efe28a3ed6f21e75674ef6203e47803da682@[::]:30301
-```
-
-
-## Monitoring your nodes
-
-[This page](https://github.com/ethereum/wiki/wiki/Network-Status) describes how to use the [The Ethereum (centralised) network status monitor (known sometimes as "eth-netstats")](http://stats.ethdev.com) to monitor your nodes.
-
-[This page](../doc/setting-up-monitoring-on-local-cluster) or [this README](https://github.com/ethersphere/eth-utils)
-describes how you set up your own monitoring service for a (private or public) local cluster.
\ No newline at end of file
diff --git a/docs/_doc/URL-Scheme.md b/docs/_doc/URL-Scheme.md
deleted file mode 100644
index b091605c3c..0000000000
--- a/docs/_doc/URL-Scheme.md
+++ /dev/null
@@ -1,270 +0,0 @@
----
-title: URL Scheme
----
-# URLs in DAPP browsers
-
-URLs should contain all allowable urls in browsers and _all_ `http(s)` urls that resolve in a usual browser must resolve the same way.
-
-All urls not conforming to the existing urls scheme must still resemble the current urls scheme.
-
-```
-://