diff --git a/package-lock.json b/package-lock.json
index 755b4f8..e61e763 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -961,6 +961,12 @@
                 "any-observable": "^0.3.0"
             }
         },
+        "@types/node": {
+            "version": "8.10.51",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.51.tgz",
+            "integrity": "sha512-cArrlJp3Yv6IyFT/DYe+rlO8o3SIHraALbBW/+CcCYW/a9QucpLI+n2p4sRxAvl2O35TiecpX2heSZtJjvEO+Q==",
+            "dev": true
+        },
         "absolute-path": {
             "version": "0.0.0",
             "resolved": "https://registry.npmjs.org/absolute-path/-/absolute-path-0.0.0.tgz",
@@ -1004,6 +1010,15 @@
             "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz",
             "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE="
         },
+        "ansi-align": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
+            "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
+            "dev": true,
+            "requires": {
+                "string-width": "^2.0.0"
+            }
+        },
         "ansi-colors": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
@@ -1361,6 +1376,12 @@
             "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
             "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw="
         },
+        "array-find-index": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+            "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+            "dev": true
+        },
         "array-includes": {
             "version": "3.0.3",
             "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz",
@@ -1401,6 +1422,21 @@
             "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
             "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
         },
+        "asn1": {
+            "version": "0.2.4",
+            "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+            "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+            "dev": true,
+            "requires": {
+                "safer-buffer": "~2.1.0"
+            }
+        },
+        "assert-plus": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+            "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+            "dev": true
+        },
         "assign-symbols": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
@@ -1425,11 +1461,29 @@
             "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
             "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
         },
+        "asynckit": {
+            "version": "0.4.0",
+            "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+            "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+            "dev": true
+        },
         "atob": {
             "version": "2.1.2",
             "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
             "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
         },
+        "aws-sign2": {
+            "version": "0.7.0",
+            "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+            "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+            "dev": true
+        },
+        "aws4": {
+            "version": "1.8.0",
+            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+            "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+            "dev": true
+        },
         "babel-code-frame": {
             "version": "6.26.0",
             "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
@@ -2378,11 +2432,35 @@
                 "safe-buffer": "5.1.2"
             }
         },
+        "bcrypt-pbkdf": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+            "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+            "dev": true,
+            "requires": {
+                "tweetnacl": "^0.14.3"
+            }
+        },
         "big-integer": {
             "version": "1.6.44",
             "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.44.tgz",
             "integrity": "sha512-7MzElZPTyJ2fNvBkPxtFQ2fWIkVmuzw41+BZHSzpEq3ymB2MfeKp1+yXl/tS75xCx+WnyV+yb0kp+K1C3UNwmQ=="
         },
+        "boxen": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
+            "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
+            "dev": true,
+            "requires": {
+                "ansi-align": "^2.0.0",
+                "camelcase": "^4.0.0",
+                "chalk": "^2.0.1",
+                "cli-boxes": "^1.0.0",
+                "string-width": "^2.0.0",
+                "term-size": "^1.2.0",
+                "widest-line": "^2.0.0"
+            }
+        },
         "bplist-creator": {
             "version": "0.0.7",
             "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.7.tgz",
@@ -2500,6 +2578,24 @@
             "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
             "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
         },
+        "camelcase-keys": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+            "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+            "dev": true,
+            "requires": {
+                "camelcase": "^2.0.0",
+                "map-obj": "^1.0.0"
+            },
+            "dependencies": {
+                "camelcase": {
+                    "version": "2.1.1",
+                    "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+                    "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+                    "dev": true
+                }
+            }
+        },
         "caniuse-lite": {
             "version": "1.0.30000983",
             "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000983.tgz",
@@ -2514,6 +2610,18 @@
                 "rsvp": "^3.3.3"
             }
         },
+        "capture-stack-trace": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz",
+            "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==",
+            "dev": true
+        },
+        "caseless": {
+            "version": "0.12.0",
+            "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+            "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+            "dev": true
+        },
         "chalk": {
             "version": "2.4.2",
             "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -2579,6 +2687,12 @@
                 }
             }
         },
+        "cli-boxes": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+            "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
+            "dev": true
+        },
         "cli-cursor": {
             "version": "2.1.0",
             "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
@@ -2675,6 +2789,15 @@
             "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
             "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="
         },
+        "combined-stream": {
+            "version": "1.0.8",
+            "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+            "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+            "dev": true,
+            "requires": {
+                "delayed-stream": "~1.0.0"
+            }
+        },
         "commander": {
             "version": "2.20.0",
             "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
@@ -2728,6 +2851,48 @@
                 "typedarray": "^0.0.6"
             }
         },
+        "configstore": {
+            "version": "3.1.2",
+            "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
+            "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
+            "dev": true,
+            "requires": {
+                "dot-prop": "^4.1.0",
+                "graceful-fs": "^4.1.2",
+                "make-dir": "^1.0.0",
+                "unique-string": "^1.0.0",
+                "write-file-atomic": "^2.0.0",
+                "xdg-basedir": "^3.0.0"
+            },
+            "dependencies": {
+                "make-dir": {
+                    "version": "1.3.0",
+                    "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+                    "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+                    "dev": true,
+                    "requires": {
+                        "pify": "^3.0.0"
+                    }
+                },
+                "pify": {
+                    "version": "3.0.0",
+                    "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+                    "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+                    "dev": true
+                },
+                "write-file-atomic": {
+                    "version": "2.4.3",
+                    "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
+                    "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
+                    "dev": true,
+                    "requires": {
+                        "graceful-fs": "^4.1.11",
+                        "imurmurhash": "^0.1.4",
+                        "signal-exit": "^3.0.2"
+                    }
+                }
+            }
+        },
         "connect": {
             "version": "3.7.0",
             "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
@@ -2790,6 +2955,15 @@
                 }
             }
         },
+        "create-error-class": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+            "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+            "dev": true,
+            "requires": {
+                "capture-stack-trace": "^1.0.0"
+            }
+        },
         "create-react-class": {
             "version": "15.6.3",
             "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz",
@@ -2831,6 +3005,30 @@
                 "which": "^1.2.9"
             }
         },
+        "crypto-random-string": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
+            "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
+            "dev": true
+        },
+        "currently-unhandled": {
+            "version": "0.4.1",
+            "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+            "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+            "dev": true,
+            "requires": {
+                "array-find-index": "^1.0.1"
+            }
+        },
+        "dashdash": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+            "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+            "dev": true,
+            "requires": {
+                "assert-plus": "^1.0.0"
+            }
+        },
         "date-fns": {
             "version": "1.30.1",
             "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz",
@@ -2866,6 +3064,12 @@
             "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
             "dev": true
         },
+        "deep-extend": {
+            "version": "0.6.0",
+            "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+            "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+            "dev": true
+        },
         "deep-is": {
             "version": "0.1.3",
             "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
@@ -2927,6 +3131,12 @@
                 }
             }
         },
+        "delayed-stream": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+            "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+            "dev": true
+        },
         "delegates": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@@ -2961,11 +3171,97 @@
             "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz",
             "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg="
         },
+        "dot-prop": {
+            "version": "4.2.0",
+            "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
+            "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
+            "dev": true,
+            "requires": {
+                "is-obj": "^1.0.0"
+            }
+        },
+        "duplexer3": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+            "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+            "dev": true
+        },
+        "ecc-jsbn": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+            "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+            "dev": true,
+            "requires": {
+                "jsbn": "~0.1.0",
+                "safer-buffer": "^2.1.0"
+            }
+        },
         "ee-first": {
             "version": "1.1.1",
             "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
             "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
         },
+        "electron": {
+            "version": "1.8.8",
+            "resolved": "https://registry.npmjs.org/electron/-/electron-1.8.8.tgz",
+            "integrity": "sha512-1f9zJehcTTGjrkb06o6ds+gsRq6SYhZJyxOk6zIWjRH8hVy03y/RzUDELzNas71f5vcvXmfGVvyjeEsadDI8tg==",
+            "dev": true,
+            "requires": {
+                "@types/node": "^8.0.24",
+                "electron-download": "^3.0.1",
+                "extract-zip": "^1.0.3"
+            }
+        },
+        "electron-download": {
+            "version": "3.3.0",
+            "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-3.3.0.tgz",
+            "integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=",
+            "dev": true,
+            "requires": {
+                "debug": "^2.2.0",
+                "fs-extra": "^0.30.0",
+                "home-path": "^1.0.1",
+                "minimist": "^1.2.0",
+                "nugget": "^2.0.0",
+                "path-exists": "^2.1.0",
+                "rc": "^1.1.2",
+                "semver": "^5.3.0",
+                "sumchecker": "^1.2.0"
+            },
+            "dependencies": {
+                "fs-extra": {
+                    "version": "0.30.0",
+                    "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
+                    "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=",
+                    "dev": true,
+                    "requires": {
+                        "graceful-fs": "^4.1.2",
+                        "jsonfile": "^2.1.0",
+                        "klaw": "^1.0.0",
+                        "path-is-absolute": "^1.0.0",
+                        "rimraf": "^2.2.8"
+                    }
+                },
+                "jsonfile": {
+                    "version": "2.4.0",
+                    "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
+                    "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
+                    "dev": true,
+                    "requires": {
+                        "graceful-fs": "^4.1.6"
+                    }
+                },
+                "path-exists": {
+                    "version": "2.1.0",
+                    "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+                    "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+                    "dev": true,
+                    "requires": {
+                        "pinkie-promise": "^2.0.0"
+                    }
+                }
+            }
+        },
         "electron-to-chromium": {
             "version": "1.3.190",
             "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.190.tgz",
@@ -3051,6 +3347,12 @@
                 "is-symbol": "^1.0.2"
             }
         },
+        "es6-promise": {
+            "version": "4.2.8",
+            "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
+            "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==",
+            "dev": true
+        },
         "escape-html": {
             "version": "1.0.3",
             "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -3498,6 +3800,12 @@
                 "fill-range": "^2.1.0"
             }
         },
+        "extend": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+            "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+            "dev": true
+        },
         "extend-shallow": {
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
@@ -3535,6 +3843,24 @@
                 "is-extglob": "^1.0.0"
             }
         },
+        "extract-zip": {
+            "version": "1.6.7",
+            "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz",
+            "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=",
+            "dev": true,
+            "requires": {
+                "concat-stream": "1.6.2",
+                "debug": "2.6.9",
+                "mkdirp": "0.5.1",
+                "yauzl": "2.4.1"
+            }
+        },
+        "extsprintf": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+            "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+            "dev": true
+        },
         "fancy-log": {
             "version": "1.3.3",
             "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
@@ -3609,6 +3935,15 @@
                 "through2": "^2.0.0"
             }
         },
+        "fd-slicer": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
+            "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
+            "dev": true,
+            "requires": {
+                "pend": "~1.2.0"
+            }
+        },
         "figures": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
@@ -3746,6 +4081,23 @@
                 "for-in": "^1.0.1"
             }
         },
+        "forever-agent": {
+            "version": "0.6.1",
+            "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+            "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+            "dev": true
+        },
+        "form-data": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+            "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+            "dev": true,
+            "requires": {
+                "asynckit": "^0.4.0",
+                "combined-stream": "^1.0.6",
+                "mime-types": "^2.1.12"
+            }
+        },
         "fragment-cache": {
             "version": "0.2.1",
             "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
@@ -4304,6 +4656,12 @@
             "integrity": "sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg==",
             "dev": true
         },
+        "get-stdin": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+            "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+            "dev": true
+        },
         "get-stream": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
@@ -4314,6 +4672,15 @@
             "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
             "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
         },
+        "getpass": {
+            "version": "0.1.7",
+            "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+            "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+            "dev": true,
+            "requires": {
+                "assert-plus": "^1.0.0"
+            }
+        },
         "gfycat-style-urls": {
             "version": "1.0.3",
             "resolved": "https://registry.npmjs.org/gfycat-style-urls/-/gfycat-style-urls-1.0.3.tgz",
@@ -4358,6 +4725,15 @@
                 "process": "^0.11.10"
             }
         },
+        "global-dirs": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+            "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+            "dev": true,
+            "requires": {
+                "ini": "^1.3.4"
+            }
+        },
         "globals": {
             "version": "11.12.0",
             "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -4368,6 +4744,25 @@
             "resolved": "https://registry.npmjs.org/google-libphonenumber/-/google-libphonenumber-2.0.19.tgz",
             "integrity": "sha512-kwtbruT+eyiof081cxT1tltMTxgTOq3CQhUoEYBROC+vNf+COPqzfKJtVnDvgXQe4SzfbnAYkP8KoSpbJBIlSg=="
         },
+        "got": {
+            "version": "6.7.1",
+            "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+            "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+            "dev": true,
+            "requires": {
+                "create-error-class": "^3.0.0",
+                "duplexer3": "^0.1.4",
+                "get-stream": "^3.0.0",
+                "is-redirect": "^1.0.0",
+                "is-retry-allowed": "^1.0.0",
+                "is-stream": "^1.0.0",
+                "lowercase-keys": "^1.0.0",
+                "safe-buffer": "^5.0.1",
+                "timed-out": "^4.0.0",
+                "unzip-response": "^2.0.1",
+                "url-parse-lax": "^1.0.0"
+            }
+        },
         "graceful-fs": {
             "version": "4.2.0",
             "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz",
@@ -4378,6 +4773,22 @@
             "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
             "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE="
         },
+        "har-schema": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+            "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+            "dev": true
+        },
+        "har-validator": {
+            "version": "5.1.3",
+            "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+            "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+            "dev": true,
+            "requires": {
+                "ajv": "^6.5.5",
+                "har-schema": "^2.0.0"
+            }
+        },
         "has": {
             "version": "1.0.3",
             "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -4469,6 +4880,12 @@
             "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz",
             "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw=="
         },
+        "home-path": {
+            "version": "1.0.6",
+            "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.6.tgz",
+            "integrity": "sha512-wo+yjrdAtoXt43Vy92a+0IPCYViiyLAHyp0QVS4xL/tfvVz5sXIW1ubLZk3nhVkD92fQpUMKX+fzMjr5F489vw==",
+            "dev": true
+        },
         "hosted-git-info": {
             "version": "2.7.1",
             "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
@@ -4486,6 +4903,17 @@
                 "toidentifier": "1.0.0"
             }
         },
+        "http-signature": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+            "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+            "dev": true,
+            "requires": {
+                "assert-plus": "^1.0.0",
+                "jsprim": "^1.2.2",
+                "sshpk": "^1.7.0"
+            }
+        },
         "husky": {
             "version": "0.14.3",
             "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz",
@@ -4533,6 +4961,12 @@
                 "resolve-from": "^3.0.0"
             }
         },
+        "import-lazy": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+            "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+            "dev": true
+        },
         "imurmurhash": {
             "version": "0.1.4",
             "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -4558,6 +4992,12 @@
             "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
             "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
         },
+        "ini": {
+            "version": "1.3.5",
+            "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+            "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+            "dev": true
+        },
         "inquirer": {
             "version": "3.3.0",
             "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
@@ -4607,6 +5047,12 @@
             "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
             "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
         },
+        "ip": {
+            "version": "1.1.5",
+            "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
+            "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+            "dev": true
+        },
         "is-accessor-descriptor": {
             "version": "0.1.6",
             "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
@@ -4699,6 +5145,15 @@
             "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
             "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
         },
+        "is-finite": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+            "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+            "dev": true,
+            "requires": {
+                "number-is-nan": "^1.0.0"
+            }
+        },
         "is-fullwidth-code-point": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
@@ -4715,6 +5170,22 @@
                 "is-extglob": "^1.0.0"
             }
         },
+        "is-installed-globally": {
+            "version": "0.1.0",
+            "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
+            "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
+            "dev": true,
+            "requires": {
+                "global-dirs": "^0.1.0",
+                "is-path-inside": "^1.0.0"
+            }
+        },
+        "is-npm": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
+            "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
+            "dev": true
+        },
         "is-number": {
             "version": "2.1.0",
             "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
@@ -4738,6 +5209,15 @@
                 "symbol-observable": "^1.1.0"
             }
         },
+        "is-path-inside": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+            "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+            "dev": true,
+            "requires": {
+                "path-is-inside": "^1.0.1"
+            }
+        },
         "is-plain-object": {
             "version": "2.0.4",
             "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@@ -4768,6 +5248,12 @@
             "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
             "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
         },
+        "is-redirect": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+            "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
+            "dev": true
+        },
         "is-regex": {
             "version": "1.0.4",
             "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
@@ -4783,6 +5269,12 @@
             "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
             "dev": true
         },
+        "is-retry-allowed": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
+            "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
+            "dev": true
+        },
         "is-stream": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
@@ -4797,6 +5289,18 @@
                 "has-symbols": "^1.0.0"
             }
         },
+        "is-typedarray": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+            "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+            "dev": true
+        },
+        "is-utf8": {
+            "version": "0.2.1",
+            "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+            "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+            "dev": true
+        },
         "is-windows": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
@@ -4845,6 +5349,12 @@
                 }
             }
         },
+        "isstream": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+            "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+            "dev": true
+        },
         "jest-get-type": {
             "version": "22.4.3",
             "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz",
@@ -4931,6 +5441,12 @@
                 "esprima": "^4.0.0"
             }
         },
+        "jsbn": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+            "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+            "dev": true
+        },
         "jsesc": {
             "version": "2.5.2",
             "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -4941,6 +5457,12 @@
             "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
             "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
         },
+        "json-schema": {
+            "version": "0.2.3",
+            "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+            "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+            "dev": true
+        },
         "json-schema-traverse": {
             "version": "0.4.1",
             "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -4987,6 +5509,18 @@
             "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
             "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
         },
+        "jsprim": {
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+            "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+            "dev": true,
+            "requires": {
+                "assert-plus": "1.0.0",
+                "extsprintf": "1.3.0",
+                "json-schema": "0.2.3",
+                "verror": "1.10.0"
+            }
+        },
         "jsx-ast-utils": {
             "version": "2.2.1",
             "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz",
@@ -5018,9 +5552,18 @@
                 "graceful-fs": "^4.1.9"
             }
         },
+        "latest-version": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
+            "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
+            "dev": true,
+            "requires": {
+                "package-json": "^4.0.0"
+            }
+        },
         "lbry-redux": {
-            "version": "github:lbryio/lbry-redux#b2044499c5f43e519384433538c1225d56d3a1f2",
-            "from": "github:lbryio/lbry-redux#multi-claim-search",
+            "version": "github:lbryio/lbry-redux#cd23c12fb7fd541d28d7cbf3874b1058b036fd13",
+            "from": "github:lbryio/lbry-redux#cd23c12fb7fd541d28d7cbf3874b1058b036fd13",
             "requires": {
                 "proxy-polyfill": "0.1.6",
                 "reselect": "^3.0.0",
@@ -5669,6 +6212,22 @@
                 "js-tokens": "^3.0.0 || ^4.0.0"
             }
         },
+        "loud-rejection": {
+            "version": "1.6.0",
+            "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+            "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+            "dev": true,
+            "requires": {
+                "currently-unhandled": "^0.4.1",
+                "signal-exit": "^3.0.0"
+            }
+        },
+        "lowercase-keys": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+            "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+            "dev": true
+        },
         "lru-cache": {
             "version": "4.1.5",
             "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
@@ -5720,6 +6279,12 @@
             "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
             "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
         },
+        "map-obj": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+            "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+            "dev": true
+        },
         "map-visit": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
@@ -5741,6 +6306,99 @@
                 "mimic-fn": "^1.0.0"
             }
         },
+        "meow": {
+            "version": "3.7.0",
+            "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+            "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+            "dev": true,
+            "requires": {
+                "camelcase-keys": "^2.0.0",
+                "decamelize": "^1.1.2",
+                "loud-rejection": "^1.0.0",
+                "map-obj": "^1.0.1",
+                "minimist": "^1.1.3",
+                "normalize-package-data": "^2.3.4",
+                "object-assign": "^4.0.1",
+                "read-pkg-up": "^1.0.1",
+                "redent": "^1.0.0",
+                "trim-newlines": "^1.0.0"
+            },
+            "dependencies": {
+                "find-up": {
+                    "version": "1.1.2",
+                    "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+                    "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+                    "dev": true,
+                    "requires": {
+                        "path-exists": "^2.0.0",
+                        "pinkie-promise": "^2.0.0"
+                    }
+                },
+                "load-json-file": {
+                    "version": "1.1.0",
+                    "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+                    "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+                    "dev": true,
+                    "requires": {
+                        "graceful-fs": "^4.1.2",
+                        "parse-json": "^2.2.0",
+                        "pify": "^2.0.0",
+                        "pinkie-promise": "^2.0.0",
+                        "strip-bom": "^2.0.0"
+                    }
+                },
+                "path-exists": {
+                    "version": "2.1.0",
+                    "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+                    "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+                    "dev": true,
+                    "requires": {
+                        "pinkie-promise": "^2.0.0"
+                    }
+                },
+                "path-type": {
+                    "version": "1.1.0",
+                    "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+                    "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+                    "dev": true,
+                    "requires": {
+                        "graceful-fs": "^4.1.2",
+                        "pify": "^2.0.0",
+                        "pinkie-promise": "^2.0.0"
+                    }
+                },
+                "read-pkg": {
+                    "version": "1.1.0",
+                    "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+                    "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+                    "dev": true,
+                    "requires": {
+                        "load-json-file": "^1.0.0",
+                        "normalize-package-data": "^2.3.2",
+                        "path-type": "^1.0.0"
+                    }
+                },
+                "read-pkg-up": {
+                    "version": "1.0.1",
+                    "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+                    "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+                    "dev": true,
+                    "requires": {
+                        "find-up": "^1.0.0",
+                        "read-pkg": "^1.0.0"
+                    }
+                },
+                "strip-bom": {
+                    "version": "2.0.0",
+                    "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+                    "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+                    "dev": true,
+                    "requires": {
+                        "is-utf8": "^0.2.0"
+                    }
+                }
+            }
+        },
         "merge": {
             "version": "1.2.1",
             "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz",
@@ -6382,6 +7040,21 @@
                 "gauge": "~1.2.5"
             }
         },
+        "nugget": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz",
+            "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=",
+            "dev": true,
+            "requires": {
+                "debug": "^2.1.3",
+                "minimist": "^1.1.0",
+                "pretty-bytes": "^1.0.2",
+                "progress-stream": "^1.1.0",
+                "request": "^2.45.0",
+                "single-line-log": "^1.1.2",
+                "throttleit": "0.0.2"
+            }
+        },
         "nullthrows": {
             "version": "1.1.1",
             "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz",
@@ -6392,6 +7065,12 @@
             "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
             "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
         },
+        "oauth-sign": {
+            "version": "0.9.0",
+            "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+            "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+            "dev": true
+        },
         "object-assign": {
             "version": "4.1.1",
             "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -6642,6 +7321,18 @@
             "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
             "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
         },
+        "package-json": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
+            "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
+            "dev": true,
+            "requires": {
+                "got": "^6.7.1",
+                "registry-auth-token": "^3.0.1",
+                "registry-url": "^3.0.3",
+                "semver": "^5.1.0"
+            }
+        },
         "parent-module": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -6742,11 +7433,38 @@
                 "pify": "^2.0.0"
             }
         },
+        "pend": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+            "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+            "dev": true
+        },
+        "performance-now": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+            "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+            "dev": true
+        },
         "pify": {
             "version": "2.3.0",
             "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
             "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
         },
+        "pinkie": {
+            "version": "2.0.4",
+            "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+            "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+            "dev": true
+        },
+        "pinkie-promise": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+            "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+            "dev": true,
+            "requires": {
+                "pinkie": "^2.0.0"
+            }
+        },
         "pirates": {
             "version": "4.0.1",
             "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
@@ -6883,6 +7601,12 @@
             "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
             "dev": true
         },
+        "prepend-http": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+            "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+            "dev": true
+        },
         "preserve": {
             "version": "0.2.0",
             "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
@@ -6894,6 +7618,16 @@
             "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==",
             "dev": true
         },
+        "pretty-bytes": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz",
+            "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=",
+            "dev": true,
+            "requires": {
+                "get-stdin": "^4.0.1",
+                "meow": "^3.1.0"
+            }
+        },
         "pretty-format": {
             "version": "24.0.0-alpha.6",
             "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.0.0-alpha.6.tgz",
@@ -6939,6 +7673,67 @@
             "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
             "dev": true
         },
+        "progress-stream": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz",
+            "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=",
+            "dev": true,
+            "requires": {
+                "speedometer": "~0.1.2",
+                "through2": "~0.2.3"
+            },
+            "dependencies": {
+                "isarray": {
+                    "version": "0.0.1",
+                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+                    "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+                    "dev": true
+                },
+                "object-keys": {
+                    "version": "0.4.0",
+                    "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
+                    "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=",
+                    "dev": true
+                },
+                "readable-stream": {
+                    "version": "1.1.14",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+                    "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+                    "dev": true,
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.1",
+                        "isarray": "0.0.1",
+                        "string_decoder": "~0.10.x"
+                    }
+                },
+                "string_decoder": {
+                    "version": "0.10.31",
+                    "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+                    "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+                    "dev": true
+                },
+                "through2": {
+                    "version": "0.2.3",
+                    "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz",
+                    "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=",
+                    "dev": true,
+                    "requires": {
+                        "readable-stream": "~1.1.9",
+                        "xtend": "~2.1.1"
+                    }
+                },
+                "xtend": {
+                    "version": "2.1.2",
+                    "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
+                    "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
+                    "dev": true,
+                    "requires": {
+                        "object-keys": "~0.4.0"
+                    }
+                }
+            }
+        },
         "promise": {
             "version": "7.3.1",
             "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
@@ -6967,6 +7762,12 @@
             "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
             "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
         },
+        "psl": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz",
+            "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==",
+            "dev": true
+        },
         "pump": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@@ -6982,6 +7783,12 @@
             "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
             "dev": true
         },
+        "qs": {
+            "version": "6.5.2",
+            "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+            "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+            "dev": true
+        },
         "query-string": {
             "version": "6.8.1",
             "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.8.1.tgz",
@@ -7019,6 +7826,18 @@
             "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
             "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
         },
+        "rc": {
+            "version": "1.2.8",
+            "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+            "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+            "dev": true,
+            "requires": {
+                "deep-extend": "^0.6.0",
+                "ini": "~1.3.0",
+                "minimist": "^1.2.0",
+                "strip-json-comments": "~2.0.1"
+            }
+        },
         "react": {
             "version": "16.8.6",
             "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz",
@@ -7040,6 +7859,20 @@
             "resolved": "https://registry.npmjs.org/react-deep-force-update/-/react-deep-force-update-1.1.2.tgz",
             "integrity": "sha512-WUSQJ4P/wWcusaH+zZmbECOk7H5N2pOIl0vzheeornkIMhu+qrNdGFm0bDZLCb0hSF0jf/kH1SgkNGfBdTc4wA=="
         },
+        "react-devtools": {
+            "version": "3.6.3",
+            "resolved": "https://registry.npmjs.org/react-devtools/-/react-devtools-3.6.3.tgz",
+            "integrity": "sha512-7JrGlKHvyamqDfDi7EEoIC8BHygKC1Mc8PmAAYm0aokwYuam/42bO1gnF5y2K7K1MbO+6f7J93s1N4VK0YdmEw==",
+            "dev": true,
+            "requires": {
+                "cross-spawn": "^5.0.1",
+                "electron": "^1.8.7",
+                "ip": "^1.1.4",
+                "minimist": "^1.2.0",
+                "react-devtools-core": "^3.6.0",
+                "update-notifier": "^2.1.0"
+            }
+        },
         "react-devtools-core": {
             "version": "3.6.1",
             "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-3.6.1.tgz",
@@ -7676,6 +8509,36 @@
                 "util-deprecate": "~1.0.1"
             }
         },
+        "redent": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+            "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+            "dev": true,
+            "requires": {
+                "indent-string": "^2.1.0",
+                "strip-indent": "^1.0.1"
+            },
+            "dependencies": {
+                "indent-string": {
+                    "version": "2.1.0",
+                    "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+                    "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+                    "dev": true,
+                    "requires": {
+                        "repeating": "^2.0.0"
+                    }
+                },
+                "strip-indent": {
+                    "version": "1.0.1",
+                    "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+                    "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+                    "dev": true,
+                    "requires": {
+                        "get-stdin": "^4.0.1"
+                    }
+                }
+            }
+        },
         "redux": {
             "version": "4.0.4",
             "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.4.tgz",
@@ -7691,11 +8554,11 @@
             "integrity": "sha512-sSJAzNq7zka3qVHKce1hbvqf0Vf5DuTVm7dr4GtsqQVOexnrvbV47RWFiPxQ8fscnyiuWyD2O92DOxPl0tGCRg=="
         },
         "redux-persist-filesystem-storage": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/redux-persist-filesystem-storage/-/redux-persist-filesystem-storage-1.4.0.tgz",
-            "integrity": "sha512-Sf1gwJJMDXteOFjpKhVVpUhFse4poWlmYvJRdBuFuAvA4rHF+QgBOjnV0w6QdXFPBPHSzQBHpVpfBKRBO+CfgQ==",
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/redux-persist-filesystem-storage/-/redux-persist-filesystem-storage-1.4.1.tgz",
+            "integrity": "sha512-QDBlRWdFpn4JMrdLZcimwT7d3yc0xkSnA5j9xKWAY2Qw9rd3Uzlt76qXwEuuQ4M3qgKu/nLE8Roazl5BUcxfcA==",
             "requires": {
-                "rn-fetch-blob": "^0.10.0"
+                "rn-fetch-blob": "0.10.15"
             }
         },
         "redux-persist-transform-compress": {
@@ -7788,6 +8651,25 @@
                 "unicode-match-property-value-ecmascript": "^1.1.0"
             }
         },
+        "registry-auth-token": {
+            "version": "3.4.0",
+            "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz",
+            "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==",
+            "dev": true,
+            "requires": {
+                "rc": "^1.1.6",
+                "safe-buffer": "^5.0.1"
+            }
+        },
+        "registry-url": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+            "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+            "dev": true,
+            "requires": {
+                "rc": "^1.0.1"
+            }
+        },
         "regjsgen": {
             "version": "0.5.0",
             "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz",
@@ -7823,6 +8705,43 @@
             "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
             "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
         },
+        "repeating": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+            "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+            "dev": true,
+            "requires": {
+                "is-finite": "^1.0.0"
+            }
+        },
+        "request": {
+            "version": "2.88.0",
+            "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+            "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+            "dev": true,
+            "requires": {
+                "aws-sign2": "~0.7.0",
+                "aws4": "^1.8.0",
+                "caseless": "~0.12.0",
+                "combined-stream": "~1.0.6",
+                "extend": "~3.0.2",
+                "forever-agent": "~0.6.1",
+                "form-data": "~2.3.2",
+                "har-validator": "~5.1.0",
+                "http-signature": "~1.2.0",
+                "is-typedarray": "~1.0.0",
+                "isstream": "~0.1.2",
+                "json-stringify-safe": "~5.0.1",
+                "mime-types": "~2.1.19",
+                "oauth-sign": "~0.9.0",
+                "performance-now": "^2.1.0",
+                "qs": "~6.5.2",
+                "safe-buffer": "^5.1.2",
+                "tough-cookie": "~2.4.3",
+                "tunnel-agent": "^0.6.0",
+                "uuid": "^3.3.2"
+            }
+        },
         "require-directory": {
             "version": "2.1.1",
             "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -8281,6 +9200,15 @@
             "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
             "dev": true
         },
+        "semver-diff": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
+            "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
+            "dev": true,
+            "requires": {
+                "semver": "^5.0.3"
+            }
+        },
         "send": {
             "version": "0.17.1",
             "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
@@ -8409,6 +9337,28 @@
                 "plist": "^3.0.1"
             }
         },
+        "single-line-log": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz",
+            "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=",
+            "dev": true,
+            "requires": {
+                "string-width": "^1.0.1"
+            },
+            "dependencies": {
+                "string-width": {
+                    "version": "1.0.2",
+                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+                    "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+                    "dev": true,
+                    "requires": {
+                        "code-point-at": "^1.0.0",
+                        "is-fullwidth-code-point": "^1.0.0",
+                        "strip-ansi": "^3.0.0"
+                    }
+                }
+            }
+        },
         "slash": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
@@ -8610,6 +9560,12 @@
             "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
             "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q=="
         },
+        "speedometer": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz",
+            "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=",
+            "dev": true
+        },
         "split-on-first": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz",
@@ -8628,6 +9584,23 @@
             "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
             "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
         },
+        "sshpk": {
+            "version": "1.16.1",
+            "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+            "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+            "dev": true,
+            "requires": {
+                "asn1": "~0.2.3",
+                "assert-plus": "^1.0.0",
+                "bcrypt-pbkdf": "^1.0.0",
+                "dashdash": "^1.12.0",
+                "ecc-jsbn": "~0.1.1",
+                "getpass": "^0.1.1",
+                "jsbn": "~0.1.0",
+                "safer-buffer": "^2.0.2",
+                "tweetnacl": "~0.14.0"
+            }
+        },
         "stacktrace-parser": {
             "version": "0.1.6",
             "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.6.tgz",
@@ -8760,6 +9733,16 @@
             "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
             "dev": true
         },
+        "sumchecker": {
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz",
+            "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=",
+            "dev": true,
+            "requires": {
+                "debug": "^2.2.0",
+                "es6-promise": "^4.0.5"
+            }
+        },
         "supports-color": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
@@ -8832,6 +9815,15 @@
                 }
             }
         },
+        "term-size": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
+            "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
+            "dev": true,
+            "requires": {
+                "execa": "^0.7.0"
+            }
+        },
         "text-table": {
             "version": "0.2.0",
             "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -8843,6 +9835,12 @@
             "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz",
             "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo="
         },
+        "throttleit": {
+            "version": "0.0.2",
+            "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz",
+            "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=",
+            "dev": true
+        },
         "through": {
             "version": "2.3.8",
             "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -8862,6 +9860,12 @@
             "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
             "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM="
         },
+        "timed-out": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+            "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+            "dev": true
+        },
         "tmp": {
             "version": "0.0.33",
             "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
@@ -8923,6 +9927,30 @@
             "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
             "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
         },
+        "tough-cookie": {
+            "version": "2.4.3",
+            "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+            "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+            "dev": true,
+            "requires": {
+                "psl": "^1.1.24",
+                "punycode": "^1.4.1"
+            },
+            "dependencies": {
+                "punycode": {
+                    "version": "1.4.1",
+                    "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+                    "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+                    "dev": true
+                }
+            }
+        },
+        "trim-newlines": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+            "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+            "dev": true
+        },
         "trim-right": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
@@ -8934,6 +9962,21 @@
             "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
             "dev": true
         },
+        "tunnel-agent": {
+            "version": "0.6.0",
+            "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+            "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+            "dev": true,
+            "requires": {
+                "safe-buffer": "^5.0.1"
+            }
+        },
+        "tweetnacl": {
+            "version": "0.14.5",
+            "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+            "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+            "dev": true
+        },
         "type-check": {
             "version": "0.3.2",
             "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
@@ -9019,6 +10062,15 @@
                 "set-value": "^2.0.1"
             }
         },
+        "unique-string": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
+            "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
+            "dev": true,
+            "requires": {
+                "crypto-random-string": "^1.0.0"
+            }
+        },
         "universalify": {
             "version": "0.1.2",
             "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
@@ -9070,6 +10122,30 @@
                 }
             }
         },
+        "unzip-response": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+            "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
+            "dev": true
+        },
+        "update-notifier": {
+            "version": "2.5.0",
+            "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
+            "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==",
+            "dev": true,
+            "requires": {
+                "boxen": "^1.2.1",
+                "chalk": "^2.0.1",
+                "configstore": "^3.0.0",
+                "import-lazy": "^2.1.0",
+                "is-ci": "^1.0.10",
+                "is-installed-globally": "^0.1.0",
+                "is-npm": "^1.0.0",
+                "latest-version": "^3.0.0",
+                "semver-diff": "^2.0.0",
+                "xdg-basedir": "^3.0.0"
+            }
+        },
         "uri-js": {
             "version": "4.2.2",
             "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
@@ -9084,6 +10160,15 @@
             "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
             "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
         },
+        "url-parse-lax": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+            "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+            "dev": true,
+            "requires": {
+                "prepend-http": "^1.0.1"
+            }
+        },
         "use": {
             "version": "3.1.1",
             "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
@@ -9123,6 +10208,17 @@
             "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
             "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
         },
+        "verror": {
+            "version": "1.10.0",
+            "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+            "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+            "dev": true,
+            "requires": {
+                "assert-plus": "^1.0.0",
+                "core-util-is": "1.0.2",
+                "extsprintf": "^1.2.0"
+            }
+        },
         "walker": {
             "version": "1.0.7",
             "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
@@ -9158,6 +10254,15 @@
             "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
             "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
         },
+        "widest-line": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz",
+            "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==",
+            "dev": true,
+            "requires": {
+                "string-width": "^2.1.1"
+            }
+        },
         "wordwrap": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
@@ -9231,6 +10336,12 @@
                 "uuid": "^3.3.2"
             }
         },
+        "xdg-basedir": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
+            "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
+            "dev": true
+        },
         "xmlbuilder": {
             "version": "9.0.7",
             "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
@@ -9296,6 +10407,15 @@
             "requires": {
                 "camelcase": "^4.1.0"
             }
+        },
+        "yauzl": {
+            "version": "2.4.1",
+            "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
+            "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
+            "dev": true,
+            "requires": {
+                "fd-slicer": "~1.0.1"
+            }
         }
     }
 }
diff --git a/package.json b/package.json
index bcdeb55..608ad18 100644
--- a/package.json
+++ b/package.json
@@ -4,6 +4,7 @@
     "private": "true",
     "scripts": {
         "start": "node node_modules/react-native/local-cli/cli.js start",
+        "devtools": "react-devtools",
         "format": "prettier 'src/**/*.{js,json}' --write",
         "precommit": "lint-staged"
     },
@@ -11,7 +12,7 @@
         "base-64": "^0.1.0",
         "@expo/vector-icons": "^8.1.0",
         "gfycat-style-urls": "^1.0.3",
-        "lbry-redux": "lbryio/lbry-redux#multi-claim-search",
+        "lbry-redux": "lbryio/lbry-redux#67a654f60630710cae72419448a73a18d076d18a",
         "lbryinc": "lbryio/lbryinc",
         "lodash": ">=4.17.11",
         "merge": ">=1.2.1",
@@ -63,6 +64,7 @@
         "husky": "^0.14.3",
         "lint-staged": "^7.0.4",
         "metro-react-native-babel-preset": "^0.55.0",
-        "prettier": "^1.11.1"
+        "prettier": "^1.11.1",
+        "react-devtools": "^3.6.3"
     }
 }
diff --git a/src/component/claimList/view.js b/src/component/claimList/view.js
index 33c10ce..d74e01a 100644
--- a/src/component/claimList/view.js
+++ b/src/component/claimList/view.js
@@ -12,7 +12,7 @@ import claimListStyle from 'styles/claimList';
 import discoverStyle from 'styles/discover';
 import moment from 'moment';
 
-const horizontalLimit = 10;
+const horizontalLimit = 7;
 const softLimit = 500;
 
 class ClaimList extends React.PureComponent {
@@ -199,8 +199,8 @@ class ClaimList extends React.PureComponent {
             ListHeaderComponent={ListHeaderComponent}
             style={claimListStyle.verticalScrollContainer}
             contentContainerStyle={claimListStyle.verticalScrollPadding}
-            initialNumToRender={8}
-            maxToRenderPerBatch={24}
+            initialNumToRender={10}
+            maxToRenderPerBatch={20}
             removeClippedSubviews
             renderItem={({ item }) => (
               <FileListItem key={item} uri={item} style={claimListStyle.verticalListItem} navigation={navigation} />
@@ -208,7 +208,7 @@ class ClaimList extends React.PureComponent {
             data={data}
             keyExtractor={(item, index) => item}
             onEndReached={this.handleVerticalEndReached}
-            onEndReachedThreshold={0.9}
+            onEndReachedThreshold={0.2}
           />
           {(((subscriptionsView || trendingForAllView) && claimSearchLoading) || loading) && (
             <View style={claimListStyle.verticalLoading}>
diff --git a/src/component/customRewardCard/view.js b/src/component/customRewardCard/view.js
index 73d2aa2..2e8a826 100644
--- a/src/component/customRewardCard/view.js
+++ b/src/component/customRewardCard/view.js
@@ -57,7 +57,7 @@ class CustomRewardCard extends React.PureComponent<Props> {
     return (
       <View style={[rewardStyle.rewardCard, rewardStyle.row]}>
         <View style={rewardStyle.leftCol}>
-          {rewardIsPending && <ActivityIndicator size="small" color={Colors.LbryGreen} />}
+          {rewardIsPending && <ActivityIndicator size="small" color={Colors.NextLbryGreen} />}
         </View>
         <View style={rewardStyle.midCol}>
           <Text style={rewardStyle.rewardTitle}>Custom Code</Text>
diff --git a/src/component/fileListItem/index.js b/src/component/fileListItem/index.js
index 9bda30e..b514ad9 100644
--- a/src/component/fileListItem/index.js
+++ b/src/component/fileListItem/index.js
@@ -8,12 +8,15 @@ import {
   makeSelectTitleForUri,
   makeSelectThumbnailForUri,
 } from 'lbry-redux';
+import { selectBlackListedOutpoints, selectFilteredOutpoints } from 'lbryinc';
 import { selectShowNsfw } from 'redux/selectors/settings';
 import FileListItem from './view';
 
 const select = (state, props) => ({
+  blackListedOutpoints: selectBlackListedOutpoints(state),
   claim: makeSelectClaimForUri(props.uri)(state),
   fileInfo: makeSelectFileInfoForUri(props.uri)(state),
+  filteredOutpoints: selectFilteredOutpoints(state),
   isDownloaded: !!makeSelectFileInfoForUri(props.uri)(state),
   metadata: makeSelectMetadataForUri(props.uri)(state),
   isResolvingUri: makeSelectIsUriResolving(props.uri)(state),
diff --git a/src/component/fileListItem/view.js b/src/component/fileListItem/view.js
index 8301581..90088cf 100644
--- a/src/component/fileListItem/view.js
+++ b/src/component/fileListItem/view.js
@@ -48,8 +48,10 @@ class FileListItem extends React.PureComponent {
 
   render() {
     const {
+      blackListedOutpoints,
       claim,
       fileInfo,
+      filteredOutpoints,
       metadata,
       featuredResult,
       isResolvingUri,
@@ -66,7 +68,7 @@ class FileListItem extends React.PureComponent {
     const obscureNsfw = this.props.obscureNsfw && metadata && metadata.nsfw;
     const isResolving = !fileInfo && isResolvingUri;
 
-    let name, channel, height, channelClaimId, fullChannelUri, signingChannel;
+    let name, channel, height, channelClaimId, fullChannelUri, shouldHide, signingChannel;
     if (claim) {
       name = claim.name;
       signingChannel = claim.signing_channel;
@@ -74,9 +76,14 @@ class FileListItem extends React.PureComponent {
       height = claim.height;
       channelClaimId = signingChannel ? signingChannel.claim_id : null;
       fullChannelUri = channelClaimId ? `${channel}#${channelClaimId}` : channel;
+
+      if (blackListedOutpoints || filteredOutpoints) {
+        const outpointsToHide = blackListedOutpoints.concat(filteredOutpoints);
+        shouldHide = outpointsToHide.some(outpoint => outpoint.txid === claim.txid && outpoint.nout === claim.nout);
+      }
     }
 
-    if (featuredResult && !isResolvingUri && !claim && !title && !name) {
+    if (shouldHide || (featuredResult && !isResolvingUri && !claim && !title && !name)) {
       return null;
     }
 
diff --git a/src/component/mediaPlayer/view.js b/src/component/mediaPlayer/view.js
index 64ed1cc..ba7b06b 100644
--- a/src/component/mediaPlayer/view.js
+++ b/src/component/mediaPlayer/view.js
@@ -468,7 +468,7 @@ class MediaPlayer extends React.PureComponent {
 
         {this.state.buffering && (
           <View style={mediaPlayerStyle.loadingContainer}>
-            <ActivityIndicator color={Colors.LbryGreen} size="large" />
+            <ActivityIndicator color={Colors.NextLbryGreen} size="large" />
           </View>
         )}
 
diff --git a/src/component/relatedContent/index.js b/src/component/relatedContent/index.js
index ff85171..3d75163 100644
--- a/src/component/relatedContent/index.js
+++ b/src/component/relatedContent/index.js
@@ -1,11 +1,11 @@
 import { connect } from 'react-redux';
 import {
   makeSelectClaimForUri,
-  doSearch,
   makeSelectRecommendedContentForUri,
   makeSelectTitleForUri,
   selectIsSearching,
 } from 'lbry-redux';
+import { doNativeSearch } from 'redux/actions/performance';
 import RelatedContent from './view';
 
 const select = (state, props) => ({
@@ -16,7 +16,7 @@ const select = (state, props) => ({
 });
 
 const perform = dispatch => ({
-  search: query => dispatch(doSearch(query, 20, undefined, true)),
+  search: query => dispatch(doNativeSearch(query, 20, undefined, true)),
 });
 
 export default connect(
diff --git a/src/component/relatedContent/view.js b/src/component/relatedContent/view.js
index 67f0368..39a0d25 100644
--- a/src/component/relatedContent/view.js
+++ b/src/component/relatedContent/view.js
@@ -6,7 +6,7 @@ import FileListItem from 'component/fileListItem';
 import fileListStyle from 'styles/fileList';
 import relatedContentStyle from 'styles/relatedContent';
 
-export default class RelatedContent extends React.PureComponent<Props> {
+export default class RelatedContent extends React.PureComponent {
   constructor() {
     super();
 
@@ -17,7 +17,7 @@ export default class RelatedContent extends React.PureComponent<Props> {
     this.getRecommendedContent();
   }
 
-  componentDidUpdate(prevProps: Props) {
+  componentDidUpdate(prevProps) {
     const { claim, uri } = this.props;
 
     if (uri !== prevProps.uri) {
@@ -38,7 +38,7 @@ export default class RelatedContent extends React.PureComponent<Props> {
     }
   }
 
-  didSearch: ?boolean;
+  didSearch;
 
   render() {
     const { recommendedContent, isSearching, navigation } = this.props;
@@ -60,7 +60,9 @@ export default class RelatedContent extends React.PureComponent<Props> {
               onPress={() => navigateToUri(navigation, recommendedUri, { autoplay: true })}
             />
           ))}
-        {isSearching && <ActivityIndicator size="small" color={Colors.LbryGreen} style={relatedContentStyle.loading} />}
+        {isSearching && (
+          <ActivityIndicator size="small" color={Colors.NextLbryGreen} style={relatedContentStyle.loading} />
+        )}
       </View>
     );
   }
diff --git a/src/component/rewardCard/view.js b/src/component/rewardCard/view.js
index 1c4068a..0e35ab5 100644
--- a/src/component/rewardCard/view.js
+++ b/src/component/rewardCard/view.js
@@ -86,7 +86,7 @@ class RewardCard extends React.PureComponent<Props> {
               )}
             </TouchableOpacity>
           )}
-          {isPending && <ActivityIndicator size="small" color={Colors.LbryGreen} />}
+          {isPending && <ActivityIndicator size="small" color={Colors.NextLbryGreen} />}
         </View>
         <View style={rewardStyle.midCol}>
           <Text style={rewardStyle.rewardTitle}>{reward.reward_title}</Text>
diff --git a/src/component/subscribeButton/view.js b/src/component/subscribeButton/view.js
index f11fadd..0c88b86 100644
--- a/src/component/subscribeButton/view.js
+++ b/src/component/subscribeButton/view.js
@@ -19,7 +19,7 @@ class SubscribeButton extends React.PureComponent {
 
     const iconColor = isSubscribed ? null : Colors.Red;
     const subscriptionHandler = isSubscribed ? doChannelUnsubscribe : doChannelSubscribe;
-    const subscriptionLabel = isSubscribed ? null : __('Subscribe');
+    const subscriptionLabel = isSubscribed ? null : __('Follow');
     const { claimName } = parseURI(uri);
 
     return (
@@ -28,7 +28,7 @@ class SubscribeButton extends React.PureComponent {
         theme={'light'}
         icon={isSubscribed ? 'heart-broken' : 'heart'}
         iconColor={iconColor}
-        solid={isSubscribed ? false : true}
+        solid={!isSubscribed}
         text={hideText ? null : subscriptionLabel}
         onPress={() => {
           subscriptionHandler({
diff --git a/src/component/suggestedSubscriptionItem/view.js b/src/component/suggestedSubscriptionItem/view.js
index 286566e..fe7a686 100644
--- a/src/component/suggestedSubscriptionItem/view.js
+++ b/src/component/suggestedSubscriptionItem/view.js
@@ -42,24 +42,22 @@ class SuggestedSubscriptionItem extends React.PureComponent {
         </View>
 
         <View style={subscriptionsStyle.suggestedItemDetails}>
-          <View style={subscriptionsStyle.suggestedItemInfo}>
-            {title && (
-              <Text style={subscriptionsStyle.suggestedItemTitle} numberOfLines={1}>
-                {title}
-              </Text>
-            )}
-            <Text style={subscriptionsStyle.suggestedItemName} numberOfLines={1}>
-              {claim && claim.name}
+          {title && (
+            <Text style={subscriptionsStyle.suggestedItemTitle} numberOfLines={1}>
+              {title}
             </Text>
-            {tags && (
-              <View style={subscriptionsStyle.suggestedItemTagList}>
-                {tags &&
-                  tags
-                    .slice(0, 3)
-                    .map(tag => <Tag style={subscriptionsStyle.tag} key={tag} name={tag} navigation={navigation} />)}
-              </View>
-            )}
-          </View>
+          )}
+          <Text style={subscriptionsStyle.suggestedItemName} numberOfLines={1}>
+            {claim && claim.name}
+          </Text>
+          {tags && (
+            <View style={subscriptionsStyle.suggestedItemTagList}>
+              {tags &&
+                tags
+                  .slice(0, 3)
+                  .map(tag => <Tag style={subscriptionsStyle.tag} key={tag} name={tag} navigation={navigation} />)}
+            </View>
+          )}
         </View>
 
         <SubscribeButton style={subscriptionsStyle.suggestedItemSubscribe} uri={normalizeURI(uri)} />
diff --git a/src/component/suggestedSubscriptions/view.js b/src/component/suggestedSubscriptions/view.js
index 587a30c..99c1301 100644
--- a/src/component/suggestedSubscriptions/view.js
+++ b/src/component/suggestedSubscriptions/view.js
@@ -43,7 +43,7 @@ class SuggestedSubscriptions extends React.PureComponent {
     if (loading) {
       return (
         <View style={subscriptionsStyle.centered}>
-          <ActivityIndicator size="large" color={Colors.LbryGreen} />
+          <ActivityIndicator size="large" color={Colors.NextLbryGreen} />
         </View>
       );
     }
diff --git a/src/component/tag/view.js b/src/component/tag/view.js
index 8f56bfd..2296931 100644
--- a/src/component/tag/view.js
+++ b/src/component/tag/view.js
@@ -1,20 +1,21 @@
 import React from 'react';
 import { Text, TouchableOpacity, View } from 'react-native';
+import { formatTagName } from 'utils/helper';
 import tagStyle from 'styles/tag';
 import Colors from 'styles/colors';
-import Constants from 'constants';
+import Constants from 'constants'; // eslint-disable-line node/no-deprecated-api
 import Icon from 'react-native-vector-icons/FontAwesome5';
 
 export default class Tag extends React.PureComponent {
   onPressDefault = () => {
     const { name, navigation, type, onAddPress, onRemovePress } = this.props;
-    if ('add' === type) {
+    if (type === 'add') {
       if (onAddPress) {
         onAddPress(name);
       }
       return;
     }
-    if ('remove' === type) {
+    if (type === 'remove') {
       if (onRemovePress) {
         onRemovePress(name);
       }
@@ -48,7 +49,7 @@ export default class Tag extends React.PureComponent {
     return (
       <TouchableOpacity style={styles} onPress={onPress || this.onPressDefault}>
         <View style={tagStyle.content}>
-          <Text style={tagStyle.text}>{name}</Text>
+          <Text style={tagStyle.text}>{formatTagName(name)}</Text>
           {type && <Icon style={tagStyle.icon} name={type === 'add' ? 'plus' : 'times'} size={8} />}
         </View>
       </TouchableOpacity>
diff --git a/src/constants.js b/src/constants.js
index e64178c..d2a892e 100644
--- a/src/constants.js
+++ b/src/constants.js
@@ -103,7 +103,7 @@ const Constants = {
   TIME_ALL,
 
   CLAIM_SEARCH_SORT_BY_ITEMS: [
-    { icon: 'fire-alt', name: SORT_BY_HOT, label: 'Hot content' },
+    { icon: 'fire-alt', name: SORT_BY_HOT, label: 'Trending content' },
     { icon: 'certificate', name: SORT_BY_NEW, label: 'New content' },
     { icon: 'chart-line', name: SORT_BY_TOP, label: 'Top content' },
   ],
diff --git a/src/index.js b/src/index.js
index c35c75a..6f4835f 100644
--- a/src/index.js
+++ b/src/index.js
@@ -18,6 +18,7 @@ import {
   authReducer,
   blacklistReducer,
   costInfoReducer,
+  filteredReducer,
   homepageReducer,
   rewardsReducer,
   subscriptionsReducer,
@@ -32,7 +33,6 @@ import AppWithNavigationState, {
 } from 'component/AppNavigator';
 import { REHYDRATE, PURGE, persistCombineReducers, persistStore } from 'redux-persist';
 import getStoredStateMigrateV4 from 'redux-persist/lib/integration/getStoredStateMigrateV4';
-import AsyncStorage from '@react-native-community/async-storage';
 import FilesystemStorage from 'redux-persist-filesystem-storage';
 import createCompressor from 'redux-persist-transform-compress';
 import createFilter from 'redux-persist-transform-filter';
@@ -43,7 +43,6 @@ import thunk from 'redux-thunk';
 
 const globalExceptionHandler = (error, isFatal) => {
   if (error && NativeModules.Firebase) {
-    console.log(error);
     NativeModules.Firebase.logException(isFatal, error.message ? error.message : 'No message', JSON.stringify(error));
   }
 };
@@ -80,7 +79,7 @@ function enableBatching(reducer) {
 const compressor = createCompressor();
 const authFilter = createFilter('auth', ['authToken']);
 const contentFilter = createFilter('content', ['positions']);
-const saveClaimsFilter = createFilter('claims', ['byId', 'claimsByUri']);
+const saveClaimsFilter = createFilter('claims', ['claimsByUri']);
 const subscriptionsFilter = createFilter('subscriptions', ['enabledChannelNotifications', 'subscriptions']);
 const settingsFilter = createFilter('settings', ['clientSettings']);
 const tagsFilter = createFilter('tags', ['followedTags']);
@@ -109,6 +108,7 @@ const reducers = persistCombineReducers(persistOptions, {
   drawer: drawerReducer,
   file: fileReducer,
   fileInfo: fileInfoReducer,
+  filtered: filteredReducer,
   homepage: homepageReducer,
   nav: navigatorReducer,
   notifications: notificationsReducer,
@@ -136,11 +136,35 @@ const store = createStore(
 );
 window.store = store;
 
-persistStore(store, persistOptions, err => {
+/* const persistor = persistStore(store, persistOptions, err => {
   if (err) {
     console.log('Unable to load saved SETTINGS');
   }
 });
+window.persistor = persistor; */
+
+const persistFilter = {
+  auth: ['authToken'],
+  claims: ['byId', 'claimsByUri'],
+  content: ['positions'],
+  subscriptions: ['enabledChannelNotifications', 'subscriptions'],
+  settings: ['clientSettings'],
+  tags: ['followedTags'],
+  wallet: ['receiveAddress'],
+};
+
+store.subscribe(() => {
+  const state = (({ auth, claims, content, subscriptions, settings, tags, wallet }) => ({
+    auth,
+    claims,
+    content,
+    subscriptions,
+    settings,
+    tags,
+    wallet,
+  }))(store.getState());
+  NativeModules.StatePersistor.update(state, persistFilter);
+});
 
 // TODO: Find i18n module that is compatible with react-native
 global.__ = str => str;
diff --git a/src/page/channel/view.js b/src/page/channel/view.js
index 142111f..d481ae5 100644
--- a/src/page/channel/view.js
+++ b/src/page/channel/view.js
@@ -4,7 +4,7 @@ import { ActivityIndicator, Dimensions, Image, ScrollView, Text, TouchableOpacit
 import { TabView, SceneMap } from 'react-native-tab-view';
 import { navigateBack } from 'utils/helper';
 import Colors from 'styles/colors';
-import Constants from 'constants';
+import Constants from 'constants'; // eslint-disable-line node/no-deprecated-api
 import Button from 'component/button';
 import Link from 'component/link';
 import FileList from 'component/fileList';
@@ -53,7 +53,7 @@ class ChannelPage extends React.PureComponent {
     if (fetching) {
       contentList = (
         <View style={channelPageStyle.busyContainer}>
-          <ActivityIndicator size="large" color={Colors.LbryGreen} />
+          <ActivityIndicator size="large" color={Colors.NextLbryGreen} />
           <Text style={channelPageStyle.infoText}>Fetching content...</Text>
         </View>
       );
@@ -123,21 +123,21 @@ class ChannelPage extends React.PureComponent {
       );
     }
 
-    const { cover, description, thumbnail, email, website_url, title } = claim.value;
+    const { cover, description, thumbnail, email, website_url: websiteUrl, title } = claim.value;
     return (
       <View style={channelPageStyle.aboutTab}>
-        {!website_url && !email && !description && (
+        {!websiteUrl && !email && !description && (
           <View style={channelPageStyle.busyContainer}>
             <Text style={channelPageStyle.infoText}>Nothing here yet. Please check back later.</Text>
           </View>
         )}
 
-        {(website_url || email || description) && (
+        {(websiteUrl || email || description) && (
           <ScrollView style={channelPageStyle.aboutScroll} contentContainerStyle={channelPageStyle.aboutScrollContent}>
-            {website_url && website_url.trim().length > 0 && (
+            {websiteUrl && websiteUrl.trim().length > 0 && (
               <View style={channelPageStyle.aboutItem}>
                 <Text style={channelPageStyle.aboutTitle}>Website</Text>
-                <Link style={channelPageStyle.aboutText} text={website_url} href={website_url} />
+                <Link style={channelPageStyle.aboutText} text={websiteUrl} href={websiteUrl} />
               </View>
             )}
 
diff --git a/src/page/discover/view.js b/src/page/discover/view.js
index 875abc5..8a0c737 100644
--- a/src/page/discover/view.js
+++ b/src/page/discover/view.js
@@ -207,7 +207,7 @@ class DiscoverPage extends React.PureComponent {
 
   buildSections = () => {
     return this.state.tagCollection.map(tags => ({
-      title: tags.length === 1 ? tags[0] : 'Trending',
+      title: tags.length === 1 ? tags[0] : 'All tags you follow',
       data: [tags],
     }));
   };
@@ -216,7 +216,9 @@ class DiscoverPage extends React.PureComponent {
     const tags = followedTags.map(tag => tag.name);
 
     // each of the followed tags
-    const tagCollection = tags.map(tag => [tag]);
+    const tagCollection = _.shuffle(tags)
+      .slice(0, 6)
+      .map(tag => [tag]);
     // everything
     tagCollection.unshift(tags);
 
@@ -268,7 +270,8 @@ class DiscoverPage extends React.PureComponent {
           renderItem={({ item, index, section }) => (
             <ClaimList
               key={item.sort().join(',')}
-              orderBy={item.length > 1 ? Constants.DEFAULT_ORDER_BY : orderBy}
+              orderBy={orderBy}
+              time={Constants.TIME_WEEK}
               tags={item}
               morePlaceholder
               navigation={navigation}
diff --git a/src/page/downloads/view.js b/src/page/downloads/view.js
index cde7f3c..3bcde0c 100644
--- a/src/page/downloads/view.js
+++ b/src/page/downloads/view.js
@@ -3,7 +3,7 @@ import { Lbry, buildURI } from 'lbry-redux';
 import { ActivityIndicator, Button, FlatList, Text, TextInput, View, ScrollView } from 'react-native';
 import { navigateToUri, uriFromFileInfo } from 'utils/helper';
 import Colors from 'styles/colors';
-import Constants from 'constants';
+import Constants from 'constants'; // eslint-disable-line node/no-deprecated-api
 import PageHeader from 'component/pageHeader';
 import FileListItem from 'component/fileListItem';
 import FloatingWalletBalance from 'component/floatingWalletBalance';
@@ -65,7 +65,7 @@ class DownloadsPage extends React.PureComponent {
         )}
         {fetching && !hasDownloads && (
           <View style={downloadsStyle.busyContainer}>
-            <ActivityIndicator size="large" color={Colors.LbryGreen} style={downloadsStyle.loading} />
+            <ActivityIndicator size="large" color={Colors.NextLbryGreen} style={downloadsStyle.loading} />
           </View>
         )}
         {hasDownloads && (
diff --git a/src/page/file/view.js b/src/page/file/view.js
index 41faa94..0946718 100644
--- a/src/page/file/view.js
+++ b/src/page/file/view.js
@@ -563,11 +563,11 @@ class FilePage extends React.PureComponent {
 
     let innerContent = null;
     if ((isResolvingUri && !claim) || !claim) {
-      innerContent = (
+      return (
         <View style={filePageStyle.container}>
           {isResolvingUri && (
             <View style={filePageStyle.busyContainer}>
-              <ActivityIndicator size="large" color={Colors.LbryGreen} />
+              <ActivityIndicator size="large" color={Colors.NextLbryGreen} />
               <Text style={filePageStyle.infoText}>Loading decentralized data...</Text>
             </View>
           )}
@@ -579,9 +579,13 @@ class FilePage extends React.PureComponent {
           <UriBar value={uri} navigation={navigation} />
         </View>
       );
-    } else if (claim && claim.name.length && claim.name[0] === '@') {
-      innerContent = <ChannelPage uri={uri} navigation={navigation} />;
-    } else if (claim) {
+    }
+
+    if (claim) {
+      if (claim && claim.name.length && claim.name[0] === '@') {
+        return <ChannelPage uri={uri} navigation={navigation} />;
+      }
+
       let isClaimBlackListed = false;
 
       if (blackListedOutpoints) {
@@ -595,7 +599,7 @@ class FilePage extends React.PureComponent {
       }
 
       if (isClaimBlackListed) {
-        innerContent = (
+        return (
           <View style={filePageStyle.pageContainer}>
             <View style={filePageStyle.dmcaContainer}>
               <Text style={filePageStyle.dmcaText}>
@@ -607,358 +611,362 @@ class FilePage extends React.PureComponent {
             <UriBar value={uri} navigation={navigation} />
           </View>
         );
-      } else {
-        let tags = [];
-        if (claim && claim.value && claim.value.tags) {
-          tags = claim.value.tags;
-        }
+      }
 
-        const completed = fileInfo && fileInfo.completed;
-        const isRewardContent = rewardedContentClaimIds.includes(claim.claim_id);
-        const description = metadata.description ? metadata.description : null;
-        const mediaType = Lbry.getMediaType(contentType);
-        const isPlayable = mediaType === 'video' || mediaType === 'audio';
-        const { height, signing_channel: signingChannel, value } = claim;
-        const channelName = signingChannel && signingChannel.name;
-        const showActions =
-          fileInfo &&
-          fileInfo.download_path &&
-          !this.state.fullscreenMode &&
-          !this.state.showImageViewer &&
-          !this.state.showWebView;
-        const showFileActions =
-          fileInfo &&
-          fileInfo.download_path &&
-          (completed || (fileInfo && !fileInfo.stopped && fileInfo.written_bytes < fileInfo.total_bytes));
-        const channelClaimId = claim && claim.signing_channel && claim.signing_channel.claim_id;
-        const canSendTip = this.state.tipAmount > 0;
-        const fullChannelUri =
-          channelClaimId && channelClaimId.trim().length > 0 ? `${channelName}#${channelClaimId}` : channelName;
+      let tags = [];
+      if (claim && claim.value && claim.value.tags) {
+        tags = claim.value.tags;
+      }
 
-        const playerStyle = [
-          filePageStyle.player,
-          this.state.isLandscape
-            ? filePageStyle.containedPlayerLandscape
-            : this.state.fullscreenMode
-              ? filePageStyle.fullscreenPlayer
-              : filePageStyle.containedPlayer,
-        ];
-        const playerBgStyle = [filePageStyle.playerBackground, filePageStyle.containedPlayerBackground];
-        const fsPlayerBgStyle = [filePageStyle.playerBackground, filePageStyle.fullscreenPlayerBackground];
-        // at least 2MB (or the full download) before media can be loaded
-        const canLoadMedia =
-          this.state.streamingMode ||
-          (fileInfo && (fileInfo.written_bytes >= 2097152 || fileInfo.written_bytes === fileInfo.total_bytes)); // 2MB = 1024*1024*2
-        const isViewable = mediaType === 'image' || mediaType === 'text';
-        const isWebViewable = mediaType === 'text';
-        const canOpen = isViewable && completed;
-        const localFileUri = this.localUriForFileInfo(fileInfo);
+      const completed = fileInfo && fileInfo.completed;
+      const isRewardContent = rewardedContentClaimIds.includes(claim.claim_id);
+      const description = metadata.description ? metadata.description : null;
+      const mediaType = Lbry.getMediaType(contentType);
+      const isPlayable = mediaType === 'video' || mediaType === 'audio';
+      const { height, signing_channel: signingChannel, value } = claim;
+      const channelName = signingChannel && signingChannel.name;
+      const showActions =
+        fileInfo &&
+        fileInfo.download_path &&
+        !this.state.fullscreenMode &&
+        !this.state.showImageViewer &&
+        !this.state.showWebView;
+      const showFileActions =
+        fileInfo &&
+        fileInfo.download_path &&
+        (completed || (fileInfo && !fileInfo.stopped && fileInfo.written_bytes < fileInfo.total_bytes));
+      const channelClaimId = claim && claim.signing_channel && claim.signing_channel.claim_id;
+      const canSendTip = this.state.tipAmount > 0;
+      const fullChannelUri =
+        channelClaimId && channelClaimId.trim().length > 0 ? `${channelName}#${channelClaimId}` : channelName;
 
-        const openFile = () => {
-          if (mediaType === 'image') {
-            // use image viewer
-            if (!this.state.showImageViewer) {
-              this.setState({
-                imageUrls: [
-                  {
-                    url: localFileUri,
-                  },
-                ],
-                showImageViewer: true,
-              });
-            }
+      const playerStyle = [
+        filePageStyle.player,
+        this.state.isLandscape
+          ? filePageStyle.containedPlayerLandscape
+          : this.state.fullscreenMode
+            ? filePageStyle.fullscreenPlayer
+            : filePageStyle.containedPlayer,
+      ];
+      const playerBgStyle = [filePageStyle.playerBackground, filePageStyle.containedPlayerBackground];
+      const fsPlayerBgStyle = [filePageStyle.playerBackground, filePageStyle.fullscreenPlayerBackground];
+      // at least 2MB (or the full download) before media can be loaded
+      const canLoadMedia =
+        this.state.streamingMode ||
+        (fileInfo && (fileInfo.written_bytes >= 2097152 || fileInfo.written_bytes === fileInfo.total_bytes)); // 2MB = 1024*1024*2
+      const isViewable = mediaType === 'image' || mediaType === 'text';
+      const isWebViewable = mediaType === 'text';
+      const canOpen = isViewable && completed;
+      const localFileUri = this.localUriForFileInfo(fileInfo);
+
+      const openFile = () => {
+        if (mediaType === 'image') {
+          // use image viewer
+          if (!this.state.showImageViewer) {
+            this.setState({
+              imageUrls: [
+                {
+                  url: localFileUri,
+                },
+              ],
+              showImageViewer: true,
+            });
           }
-          if (isWebViewable) {
-            // show webview
-            if (!this.state.showWebView) {
-              this.setState({
-                showWebView: true,
-              });
-            }
+        }
+        if (isWebViewable) {
+          // show webview
+          if (!this.state.showWebView) {
+            this.setState({
+              showWebView: true,
+            });
           }
-        };
-
-        if (
-          fileInfo &&
-          !this.state.autoDownloadStarted &&
-          this.state.uriVars &&
-          this.state.uriVars.download === 'true'
-        ) {
-          this.setState({ autoDownloadStarted: true }, () => {
-            purchaseUri(uri, costInfo, !isPlayable);
-            if (NativeModules.UtilityModule) {
-              NativeModules.UtilityModule.checkDownloads();
-            }
-          });
         }
+      };
 
-        if (this.state.downloadPressed && canOpen) {
-          // automatically open a web viewable or image file after the download button is pressed
-          openFile();
-        }
+      if (fileInfo && !this.state.autoDownloadStarted && this.state.uriVars && this.state.uriVars.download === 'true') {
+        this.setState({ autoDownloadStarted: true }, () => {
+          purchaseUri(uri, costInfo, !isPlayable);
+          if (NativeModules.UtilityModule) {
+            NativeModules.UtilityModule.checkDownloads();
+          }
+        });
+      }
 
-        innerContent = (
-          <View style={filePageStyle.pageContainer}>
-            {!this.state.fullscreenMode && <UriBar value={uri} navigation={navigation} />}
-            {this.state.showWebView && isWebViewable && (
-              <WebView source={{ uri: localFileUri }} style={filePageStyle.viewer} />
-            )}
+      if (this.state.downloadPressed && canOpen) {
+        // automatically open a web viewable or image file after the download button is pressed
+        openFile();
+      }
 
-            {this.state.showImageViewer && (
-              <ImageViewer
-                style={StyleSheet.flatten(filePageStyle.viewer)}
-                imageUrls={this.state.imageUrls}
-                renderIndicator={() => null}
-              />
-            )}
+      return (
+        <View style={filePageStyle.pageContainer}>
+          {!this.state.fullscreenMode && <UriBar value={uri} navigation={navigation} />}
+          {this.state.showWebView && isWebViewable && (
+            <WebView source={{ uri: localFileUri }} style={filePageStyle.viewer} />
+          )}
 
-            {!this.state.showWebView && (
-              <View
-                style={
-                  this.state.fullscreenMode ? filePageStyle.innerPageContainerFsMode : filePageStyle.innerPageContainer
-                }
-                onLayout={this.checkOrientation}
-              >
-                <View style={filePageStyle.mediaContainer}>
-                  {(canOpen || (!fileInfo || (isPlayable && !canLoadMedia)) || (!canOpen && fileInfo)) && (
-                    <FileItemMedia style={filePageStyle.thumbnail} title={title} thumbnail={thumbnail} />
-                  )}
-                  {(!this.state.downloadButtonShown || this.state.downloadPressed) && !this.state.mediaLoaded && (
-                    <ActivityIndicator size="large" color={Colors.LbryGreen} style={filePageStyle.loading} />
-                  )}
-                  {((isPlayable && !completed && !canLoadMedia) ||
-                    canOpen ||
-                    (!completed && !this.state.streamingMode)) &&
-                    !this.state.downloadPressed && (
-                    <FileDownloadButton
-                      uri={uri}
-                      style={filePageStyle.downloadButton}
-                      openFile={openFile}
-                      isPlayable={isPlayable}
-                      isViewable={isViewable}
-                      onPlay={this.onFileDownloadButtonPlayed}
-                      onView={() => this.setState({ downloadPressed: true })}
-                      onButtonLayout={() => this.setState({ downloadButtonShown: true })}
-                    />
-                  )}
-                  {!fileInfo && (
-                    <FilePrice
-                      uri={uri}
-                      style={filePageStyle.filePriceContainer}
-                      textStyle={filePageStyle.filePriceText}
-                    />
-                  )}
+          {this.state.showImageViewer && (
+            <ImageViewer
+              style={StyleSheet.flatten(filePageStyle.viewer)}
+              imageUrls={this.state.imageUrls}
+              renderIndicator={() => null}
+            />
+          )}
 
-                  <TouchableOpacity style={filePageStyle.backButton} onPress={this.onBackButtonPressed}>
-                    <Icon name={'arrow-left'} size={18} style={filePageStyle.backButtonIcon} />
-                  </TouchableOpacity>
-                </View>
-                {(this.state.streamingMode || (canLoadMedia && fileInfo && isPlayable)) && (
-                  <View
-                    style={playerBgStyle}
-                    ref={ref => {
-                      this.playerBackground = ref;
-                    }}
-                    onLayout={evt => {
-                      if (!this.state.playerBgHeight) {
-                        this.setState({ playerBgHeight: evt.nativeEvent.layout.height });
-                      }
-                    }}
-                  />
+          {!this.state.showWebView && (
+            <View
+              style={
+                this.state.fullscreenMode ? filePageStyle.innerPageContainerFsMode : filePageStyle.innerPageContainer
+              }
+              onLayout={this.checkOrientation}
+            >
+              <View style={filePageStyle.mediaContainer}>
+                {(canOpen || (!fileInfo || (isPlayable && !canLoadMedia)) || (!canOpen && fileInfo)) && (
+                  <FileItemMedia style={filePageStyle.thumbnail} title={title} thumbnail={thumbnail} />
                 )}
-                {(this.state.streamingMode || (canLoadMedia && fileInfo && isPlayable)) &&
-                  this.state.fullscreenMode && <View style={fsPlayerBgStyle} />}
-                {(this.state.streamingMode || (canLoadMedia && fileInfo && isPlayable)) && (
-                  <MediaPlayer
-                    claim={claim}
-                    assignPlayer={ref => {
-                      this.player = ref;
-                    }}
+                {(!this.state.downloadButtonShown || this.state.downloadPressed) && !this.state.mediaLoaded && (
+                  <ActivityIndicator size="large" color={Colors.NextLbryGreen} style={filePageStyle.loading} />
+                )}
+                {((isPlayable && !completed && !canLoadMedia) ||
+                  canOpen ||
+                  (!completed && !this.state.streamingMode)) &&
+                  !this.state.downloadPressed && (
+                  <FileDownloadButton
                     uri={uri}
-                    source={this.playerUriForFileInfo(fileInfo)}
-                    style={playerStyle}
-                    autoPlay={autoplay || this.state.autoPlayMedia}
-                    onFullscreenToggled={this.handleFullscreenToggle}
-                    onLayout={evt => {
-                      if (!this.state.playerHeight) {
-                        this.setState({ playerHeight: evt.nativeEvent.layout.height });
-                      }
-                    }}
-                    onMediaLoaded={() => this.onMediaLoaded(channelName, title, uri)}
-                    onBackButtonPressed={this.onBackButtonPressed}
-                    onPlaybackStarted={this.onPlaybackStarted}
-                    onPlaybackFinished={this.onPlaybackFinished}
-                    thumbnail={thumbnail}
-                    position={position}
+                    style={filePageStyle.downloadButton}
+                    openFile={openFile}
+                    isPlayable={isPlayable}
+                    isViewable={isViewable}
+                    onPlay={this.onFileDownloadButtonPlayed}
+                    onView={() => this.setState({ downloadPressed: true })}
+                    onButtonLayout={() => this.setState({ downloadButtonShown: true })}
+                  />
+                )}
+                {!fileInfo && (
+                  <FilePrice
+                    uri={uri}
+                    style={filePageStyle.filePriceContainer}
+                    textStyle={filePageStyle.filePriceText}
                   />
                 )}
 
-                {showActions && showFileActions && (
-                  <View style={filePageStyle.actions}>
-                    {showFileActions && (
-                      <View style={filePageStyle.fileActions}>
-                        {completed && (
-                          <Button
-                            style={filePageStyle.actionButton}
-                            theme={'light'}
-                            icon={'trash'}
-                            text={'Delete'}
-                            onPress={this.onDeletePressed}
-                          />
-                        )}
-                        {!completed &&
-                          fileInfo &&
-                          !fileInfo.stopped &&
-                          fileInfo.written_bytes < fileInfo.total_bytes &&
-                          !this.state.stopDownloadConfirmed && (
-                          <Button
-                            style={filePageStyle.actionButton}
-                            icon={'stop'}
-                            theme={'light'}
-                            text={'Stop Download'}
-                            onPress={this.onStopDownloadPressed}
-                          />
-                        )}
+                <TouchableOpacity style={filePageStyle.backButton} onPress={this.onBackButtonPressed}>
+                  <Icon name={'arrow-left'} size={18} style={filePageStyle.backButtonIcon} />
+                </TouchableOpacity>
+              </View>
+              {(this.state.streamingMode || (canLoadMedia && fileInfo && isPlayable)) && (
+                <View
+                  style={playerBgStyle}
+                  ref={ref => {
+                    this.playerBackground = ref;
+                  }}
+                  onLayout={evt => {
+                    if (!this.state.playerBgHeight) {
+                      this.setState({ playerBgHeight: evt.nativeEvent.layout.height });
+                    }
+                  }}
+                />
+              )}
+              {(this.state.streamingMode || (canLoadMedia && fileInfo && isPlayable)) && this.state.fullscreenMode && (
+                <View style={fsPlayerBgStyle} />
+              )}
+              {(this.state.streamingMode || (canLoadMedia && fileInfo && isPlayable)) && (
+                <MediaPlayer
+                  claim={claim}
+                  assignPlayer={ref => {
+                    this.player = ref;
+                  }}
+                  uri={uri}
+                  source={this.playerUriForFileInfo(fileInfo)}
+                  style={playerStyle}
+                  autoPlay={autoplay || this.state.autoPlayMedia}
+                  onFullscreenToggled={this.handleFullscreenToggle}
+                  onLayout={evt => {
+                    if (!this.state.playerHeight) {
+                      this.setState({ playerHeight: evt.nativeEvent.layout.height });
+                    }
+                  }}
+                  onMediaLoaded={() => this.onMediaLoaded(channelName, title, uri)}
+                  onBackButtonPressed={this.onBackButtonPressed}
+                  onPlaybackStarted={this.onPlaybackStarted}
+                  onPlaybackFinished={this.onPlaybackFinished}
+                  thumbnail={thumbnail}
+                  position={position}
+                />
+              )}
+
+              {showActions && showFileActions && (
+                <View style={filePageStyle.actions}>
+                  {showFileActions && (
+                    <View style={filePageStyle.fileActions}>
+                      {completed && (
+                        <Button
+                          style={filePageStyle.actionButton}
+                          theme={'light'}
+                          icon={'trash'}
+                          text={'Delete'}
+                          onPress={this.onDeletePressed}
+                        />
+                      )}
+                      {!completed &&
+                        fileInfo &&
+                        !fileInfo.stopped &&
+                        fileInfo.written_bytes < fileInfo.total_bytes &&
+                        !this.state.stopDownloadConfirmed && (
+                        <Button
+                          style={filePageStyle.actionButton}
+                          icon={'stop'}
+                          theme={'light'}
+                          text={'Stop Download'}
+                          onPress={this.onStopDownloadPressed}
+                        />
+                      )}
+                    </View>
+                  )}
+                </View>
+              )}
+              <ScrollView
+                style={showActions ? filePageStyle.scrollContainerActions : filePageStyle.scrollContainer}
+                contentContainerstyle={showActions ? null : filePageStyle.scrollContent}
+                keyboardShouldPersistTaps={'handled'}
+                ref={ref => {
+                  this.scrollView = ref;
+                }}
+              >
+                <TouchableWithoutFeedback
+                  style={filePageStyle.titleTouch}
+                  onPress={() => this.setState({ showDescription: !this.state.showDescription })}
+                >
+                  <View style={filePageStyle.titleRow}>
+                    <Text style={filePageStyle.title} selectable>
+                      {title}
+                    </Text>
+                    <View style={filePageStyle.descriptionToggle}>
+                      <Icon name={this.state.showDescription ? 'caret-up' : 'caret-down'} size={24} />
+                    </View>
+                  </View>
+                </TouchableWithoutFeedback>
+                <View style={filePageStyle.channelRow}>
+                  <View style={filePageStyle.publishInfo}>
+                    {channelName && (
+                      <Link
+                        style={filePageStyle.channelName}
+                        selectable
+                        text={channelName}
+                        numberOfLines={1}
+                        ellipsizeMode={'tail'}
+                        onPress={() => {
+                          navigateToUri(navigation, normalizeURI(fullChannelUri));
+                        }}
+                      />
+                    )}
+                    {!channelName && (
+                      <Text style={filePageStyle.anonChannelName} selectable ellipsizeMode={'tail'}>
+                        Anonymous
+                      </Text>
+                    )}
+                    <DateTime
+                      style={filePageStyle.publishDate}
+                      textStyle={filePageStyle.publishDateText}
+                      uri={uri}
+                      formatOptions={{ day: 'numeric', month: 'long', year: 'numeric' }}
+                      show={DateTime.SHOW_DATE}
+                    />
+                  </View>
+                  <View style={filePageStyle.subscriptionRow}>
+                    {false && ((isPlayable && !fileInfo) || (isPlayable && fileInfo && !fileInfo.download_path)) && (
+                      <Button
+                        style={[filePageStyle.actionButton, filePageStyle.saveFileButton]}
+                        theme={'light'}
+                        icon={'download'}
+                        onPress={this.onSaveFilePressed}
+                      />
+                    )}
+                    <Button
+                      style={[filePageStyle.actionButton, filePageStyle.tipButton]}
+                      theme={'light'}
+                      icon={'gift'}
+                      onPress={() => this.setState({ showTipView: true })}
+                    />
+                    {channelName && (
+                      <SubscribeButton
+                        style={filePageStyle.actionButton}
+                        uri={fullChannelUri}
+                        name={channelName}
+                        hideText={false}
+                      />
+                    )}
+                    {channelName && (
+                      <SubscribeNotificationButton
+                        style={[filePageStyle.actionButton, filePageStyle.bellButton]}
+                        uri={fullChannelUri}
+                        name={channelName}
+                      />
+                    )}
+                  </View>
+                </View>
+
+                {this.state.showTipView && <View style={filePageStyle.divider} />}
+                {this.state.showTipView && (
+                  <View style={filePageStyle.tipCard}>
+                    <View style={filePageStyle.row}>
+                      <View style={filePageStyle.amountRow}>
+                        <TextInput
+                          ref={ref => (this.tipAmountInput = ref)}
+                          onChangeText={value => this.setState({ tipAmount: value })}
+                          keyboardType={'numeric'}
+                          placeholder={'0'}
+                          value={this.state.tipAmount}
+                          style={[filePageStyle.input, filePageStyle.tipAmountInput]}
+                        />
+                        <Text style={[filePageStyle.text, filePageStyle.currency]}>LBC</Text>
+                      </View>
+                      <Link
+                        style={[filePageStyle.link, filePageStyle.cancelTipLink]}
+                        text={'Cancel'}
+                        onPress={() => this.setState({ showTipView: false })}
+                      />
+                      <Button
+                        text={'Send a tip'}
+                        style={[filePageStyle.button, filePageStyle.sendButton]}
+                        disabled={!canSendTip}
+                        onPress={this.handleSendTip}
+                      />
+                    </View>
+                  </View>
+                )}
+
+                {this.state.showDescription && description && description.length > 0 && (
+                  <View style={filePageStyle.divider} />
+                )}
+                {this.state.showDescription && description && (
+                  <View>
+                    <Text style={filePageStyle.description} selectable>
+                      {this.linkify(description)}
+                    </Text>
+                    {tags && tags.length > 0 && (
+                      <View style={filePageStyle.tagContainer}>
+                        <Text style={filePageStyle.tagTitle}>Tags</Text>
+                        <View style={filePageStyle.tagList}>{this.renderTags(tags)}</View>
                       </View>
                     )}
                   </View>
                 )}
-                <ScrollView
-                  style={showActions ? filePageStyle.scrollContainerActions : filePageStyle.scrollContainer}
-                  contentContainerstyle={showActions ? null : filePageStyle.scrollContent}
-                  keyboardShouldPersistTaps={'handled'}
-                  ref={ref => {
-                    this.scrollView = ref;
-                  }}
-                >
-                  <TouchableWithoutFeedback
-                    style={filePageStyle.titleTouch}
-                    onPress={() => this.setState({ showDescription: !this.state.showDescription })}
-                  >
-                    <View style={filePageStyle.titleRow}>
-                      <Text style={filePageStyle.title} selectable>
-                        {title}
-                      </Text>
-                      <View style={filePageStyle.descriptionToggle}>
-                        <Icon name={this.state.showDescription ? 'caret-up' : 'caret-down'} size={24} />
-                      </View>
-                    </View>
-                  </TouchableWithoutFeedback>
-                  {channelName && (
-                    <View style={filePageStyle.channelRow}>
-                      <View style={filePageStyle.publishInfo}>
-                        <Link
-                          style={filePageStyle.channelName}
-                          selectable
-                          text={channelName}
-                          numberOfLines={1}
-                          ellipsizeMode={'tail'}
-                          onPress={() => {
-                            navigateToUri(navigation, normalizeURI(fullChannelUri));
-                          }}
-                        />
-                        <DateTime
-                          style={filePageStyle.publishDate}
-                          textStyle={filePageStyle.publishDateText}
-                          uri={uri}
-                          formatOptions={{ day: 'numeric', month: 'long', year: 'numeric' }}
-                          show={DateTime.SHOW_DATE}
-                        />
-                      </View>
-                      <View style={filePageStyle.subscriptionRow}>
-                        {false &&
-                          ((isPlayable && !fileInfo) || (isPlayable && fileInfo && !fileInfo.download_path)) && (
-                          <Button
-                            style={[filePageStyle.actionButton, filePageStyle.saveFileButton]}
-                            theme={'light'}
-                            icon={'download'}
-                            onPress={this.onSaveFilePressed}
-                          />
-                        )}
-                        <Button
-                          style={[filePageStyle.actionButton, filePageStyle.tipButton]}
-                          theme={'light'}
-                          icon={'gift'}
-                          onPress={() => this.setState({ showTipView: true })}
-                        />
-                        <SubscribeButton
-                          style={filePageStyle.actionButton}
-                          uri={fullChannelUri}
-                          name={channelName}
-                          hideText={false}
-                        />
-                        <SubscribeNotificationButton
-                          style={[filePageStyle.actionButton, filePageStyle.bellButton]}
-                          uri={fullChannelUri}
-                          name={channelName}
-                        />
-                      </View>
-                    </View>
-                  )}
 
-                  {this.state.showTipView && <View style={filePageStyle.divider} />}
-                  {this.state.showTipView && (
-                    <View style={filePageStyle.tipCard}>
-                      <View style={filePageStyle.row}>
-                        <View style={filePageStyle.amountRow}>
-                          <TextInput
-                            ref={ref => (this.tipAmountInput = ref)}
-                            onChangeText={value => this.setState({ tipAmount: value })}
-                            keyboardType={'numeric'}
-                            placeholder={'0'}
-                            value={this.state.tipAmount}
-                            style={[filePageStyle.input, filePageStyle.tipAmountInput]}
-                          />
-                          <Text style={[filePageStyle.text, filePageStyle.currency]}>LBC</Text>
-                        </View>
-                        <Link
-                          style={[filePageStyle.link, filePageStyle.cancelTipLink]}
-                          text={'Cancel'}
-                          onPress={() => this.setState({ showTipView: false })}
-                        />
-                        <Button
-                          text={'Send a tip'}
-                          style={[filePageStyle.button, filePageStyle.sendButton]}
-                          disabled={!canSendTip}
-                          onPress={this.handleSendTip}
-                        />
-                      </View>
-                    </View>
-                  )}
+                {costInfo && parseFloat(costInfo.cost) > balance && <FileRewardsDriver navigation={navigation} />}
 
-                  {this.state.showDescription && description && description.length > 0 && (
-                    <View style={filePageStyle.divider} />
-                  )}
-                  {this.state.showDescription && description && (
-                    <View>
-                      <Text style={filePageStyle.description} selectable>
-                        {this.linkify(description)}
-                      </Text>
-                      {tags && tags.length > 0 && (
-                        <View style={filePageStyle.tagContainer}>
-                          <Text style={filePageStyle.tagTitle}>Tags</Text>
-                          <View style={filePageStyle.tagList}>{this.renderTags(tags)}</View>
-                        </View>
-                      )}
-                    </View>
-                  )}
-
-                  {costInfo && parseFloat(costInfo.cost) > balance && <FileRewardsDriver navigation={navigation} />}
-
-                  <View onLayout={this.setRelatedContentPosition} />
-                  <RelatedContent navigation={navigation} uri={uri} />
-                </ScrollView>
-              </View>
-            )}
-            {!this.state.fullscreenMode && !this.state.showImageViewer && !this.state.showWebView && (
-              <FloatingWalletBalance navigation={navigation} />
-            )}
-          </View>
-        );
-      }
+                <View onLayout={this.setRelatedContentPosition} />
+                <RelatedContent navigation={navigation} uri={uri} />
+              </ScrollView>
+            </View>
+          )}
+          {!this.state.fullscreenMode && !this.state.showImageViewer && !this.state.showWebView && (
+            <FloatingWalletBalance navigation={navigation} />
+          )}
+        </View>
+      );
     }
 
-    return innerContent;
+    return null;
   }
 }
 
diff --git a/src/page/publish/view.js b/src/page/publish/view.js
index 9013c73..c699780 100644
--- a/src/page/publish/view.js
+++ b/src/page/publish/view.js
@@ -550,7 +550,7 @@ class PublishPage extends React.PureComponent {
           </View>
           {(!videos || !thumbnailPath || !galleryThumbnailsChecked) && (
             <View style={publishStyle.loadingView}>
-              <ActivityIndicator size="large" color={Colors.LbryGreen} />
+              <ActivityIndicator size="large" color={Colors.NextLbryGreen} />
             </View>
           )}
           {thumbnailPath && (!videos || videos.length === 0) && (
diff --git a/src/page/rewards/view.js b/src/page/rewards/view.js
index 5796f37..0a588cf 100644
--- a/src/page/rewards/view.js
+++ b/src/page/rewards/view.js
@@ -2,7 +2,7 @@ import React from 'react';
 import { Lbry } from 'lbry-redux';
 import { ActivityIndicator, NativeModules, ScrollView, Text, View } from 'react-native';
 import Colors from 'styles/colors';
-import Constants from 'constants';
+import Constants from 'constants'; // eslint-disable-line node/no-deprecated-api
 import Link from 'component/link';
 import CustomRewardCard from 'component/customRewardCard';
 import PageHeader from 'component/pageHeader';
@@ -87,7 +87,7 @@ class RewardsPage extends React.PureComponent {
       // claim new_user and new_mobile rewards
       for (let i = 0; i < rewards.length; i++) {
         const { reward_type: type } = rewards[i];
-        if ('new_user' === type || 'new_mobile' === type) {
+        if (type === 'new_user' || type === 'new_mobile') {
           claimReward(rewards[i]);
         }
       }
@@ -127,7 +127,7 @@ class RewardsPage extends React.PureComponent {
     if (fetching) {
       return (
         <View style={rewardStyle.busyContainer}>
-          <ActivityIndicator size="large" color={Colors.LbryGreen} />
+          <ActivityIndicator size="large" color={Colors.NextLbryGreen} />
           <Text style={rewardStyle.infoText}>Fetching rewards...</Text>
         </View>
       );
diff --git a/src/page/search/view.js b/src/page/search/view.js
index a8a296e..3f65cf5 100644
--- a/src/page/search/view.js
+++ b/src/page/search/view.js
@@ -3,7 +3,7 @@ import { Lbry, parseURI, normalizeURI, isURIValid } from 'lbry-redux';
 import { ActivityIndicator, Button, Text, TextInput, View, ScrollView } from 'react-native';
 import { navigateToUri } from 'utils/helper';
 import Colors from 'styles/colors';
-import Constants from 'constants';
+import Constants from 'constants'; // eslint-disable-line node/no-deprecated-api
 import PageHeader from 'component/pageHeader';
 import FileListItem from 'component/fileListItem';
 import FloatingWalletBalance from 'component/floatingWalletBalance';
@@ -91,7 +91,7 @@ class SearchPage extends React.PureComponent {
         <UriBar value={query} navigation={navigation} onSearchSubmitted={this.handleSearchSubmitted} />
         {isSearching && (
           <View style={searchStyle.busyContainer}>
-            <ActivityIndicator size="large" color={Colors.LbryGreen} style={searchStyle.loading} />
+            <ActivityIndicator size="large" color={Colors.NextLbryGreen} style={searchStyle.loading} />
           </View>
         )}
 
@@ -105,7 +105,7 @@ class SearchPage extends React.PureComponent {
               <FileListItem
                 key={this.state.currentUri}
                 uri={this.state.currentUri}
-                featuredResult={true}
+                featuredResult
                 style={searchStyle.featuredResultItem}
                 navigation={navigation}
                 onPress={() => navigateToUri(navigation, this.state.currentUri)}
@@ -113,14 +113,14 @@ class SearchPage extends React.PureComponent {
             )}
             {uris && uris.length
               ? uris.map(uri => (
-                  <FileListItem
-                    key={uri}
-                    uri={uri}
-                    style={searchStyle.resultItem}
-                    navigation={navigation}
-                    onPress={() => navigateToUri(navigation, uri)}
-                  />
-                ))
+                <FileListItem
+                  key={uri}
+                  uri={uri}
+                  style={searchStyle.resultItem}
+                  navigation={navigation}
+                  onPress={() => navigateToUri(navigation, uri)}
+                />
+              ))
               : null}
             {(!uris || uris.length === 0) && (
               <View style={searchStyle.noResults}>
diff --git a/src/page/splash/index.js b/src/page/splash/index.js
index 380ec47..d3b644e 100644
--- a/src/page/splash/index.js
+++ b/src/page/splash/index.js
@@ -3,6 +3,7 @@ import { doBalanceSubscribe, doUpdateBlockHeight, doToast } from 'lbry-redux';
 import {
   doAuthenticate,
   doBlackListedOutpointsSubscribe,
+  doFilteredOutpointsSubscribe,
   doCheckSubscriptionsInit,
   doFetchMySubscriptions,
   doFetchRewardedContent,
@@ -25,6 +26,7 @@ const perform = dispatch => ({
   authenticate: (appVersion, os) => dispatch(doAuthenticate(appVersion, os)),
   balanceSubscribe: () => dispatch(doBalanceSubscribe()),
   blacklistedOutpointsSubscribe: () => dispatch(doBlackListedOutpointsSubscribe()),
+  filteredOutpointsSubscribe: () => dispatch(doFilteredOutpointsSubscribe()),
   checkSubscriptionsInit: () => dispatch(doCheckSubscriptionsInit()),
   fetchRewardedContent: () => dispatch(doFetchRewardedContent()),
   fetchSubscriptions: callback => dispatch(doFetchMySubscriptions(callback)),
diff --git a/src/page/splash/view.js b/src/page/splash/view.js
index 38a88f0..266e07e 100644
--- a/src/page/splash/view.js
+++ b/src/page/splash/view.js
@@ -10,7 +10,7 @@ import Button from 'component/button';
 import ProgressBar from 'component/progressBar';
 import PropTypes from 'prop-types';
 import Colors from 'styles/colors';
-import Constants from 'constants';
+import Constants from 'constants'; // eslint-disable-line node/no-deprecated-api
 import splashStyle from 'styles/splash';
 
 const BLOCK_HEIGHT_INTERVAL = 1000 * 60 * 2.5; // every 2.5 minutes
@@ -50,7 +50,7 @@ class SplashScreen extends React.PureComponent {
   }
 
   navigateToMain = () => {
-    const { navigation } = this.props;
+    const { navigation, notify, verifyUserEmail, verifyUserEmailFailure } = this.props;
     const resetAction = StackActions.reset({
       index: 0,
       actions: [NavigationActions.navigate({ routeName: 'Main' })],
@@ -114,9 +114,8 @@ class SplashScreen extends React.PureComponent {
       balanceSubscribe,
       blacklistedOutpointsSubscribe,
       checkSubscriptionsInit,
+      filteredOutpointsSubscribe,
       getSync,
-      navigation,
-      notify,
       updateBlockHeight,
       user,
     } = this.props;
@@ -125,11 +124,8 @@ class SplashScreen extends React.PureComponent {
       // Leave the splash screen
       balanceSubscribe();
       blacklistedOutpointsSubscribe();
+      filteredOutpointsSubscribe();
       checkSubscriptionsInit();
-      updateBlockHeight();
-      setInterval(() => {
-        updateBlockHeight();
-      }, BLOCK_HEIGHT_INTERVAL);
 
       if (user && user.id && user.has_verified_email) {
         // user already authenticated
@@ -186,7 +182,6 @@ class SplashScreen extends React.PureComponent {
               this.finishSplashScreen();
             })
             .catch(() => this.handleAccountUnlockFailed());
-          return;
         } else {
           this.setState({
             message: testingNetwork,
@@ -222,7 +217,7 @@ class SplashScreen extends React.PureComponent {
       });
     } else if (walletStatus && walletStatus.blocks_behind > 0) {
       const behind = walletStatus.blocks_behind;
-      const behindText = behind + ' block' + (behind == 1 ? '' : 's') + ' behind';
+      const behindText = behind + ' block' + (behind === 1 ? '' : 's') + ' behind';
       this.setState({
         message: 'Blockchain Sync',
         details: behindText,
@@ -254,7 +249,7 @@ class SplashScreen extends React.PureComponent {
     // Start measuring the first launch time from the splash screen
     // (time to first user interaction - after first run completed)
     AsyncStorage.getItem('hasLaunched').then(value => {
-      if ('true' !== value) {
+      if (value !== 'true') {
         AsyncStorage.setItem('hasLaunched', 'true');
         // only set firstLaunchTime since we've determined that this is the first app launch ever
         AsyncStorage.setItem('firstLaunchTime', String(moment().unix()));
diff --git a/src/page/subscriptions/index.js b/src/page/subscriptions/index.js
index 2f9c7d9..e59a3d0 100644
--- a/src/page/subscriptions/index.js
+++ b/src/page/subscriptions/index.js
@@ -5,8 +5,9 @@ import {
   doFetchRecommendedSubscriptions,
   selectSubscriptionClaims,
   selectSubscriptions,
-  selectSubscriptionsBeingFetched,
   selectIsFetchingSubscriptions,
+  selectIsFetchingSuggested,
+  selectSuggestedChannels,
   selectUnreadSubscriptions,
   selectViewMode,
   selectFirstRunCompleted,
@@ -16,13 +17,15 @@ import { doPushDrawerStack, doSetPlayerVisible } from 'redux/actions/drawer';
 import { doSetClientSetting } from 'redux/actions/settings';
 import { makeSelectClientSetting } from 'redux/selectors/settings';
 import { selectCurrentRoute } from 'redux/selectors/drawer';
-import Constants from 'constants';
+import Constants from 'constants'; // eslint-disable-line node/no-deprecated-api
 import SubscriptionsPage from './view';
 
 const select = state => ({
   currentRoute: selectCurrentRoute(state),
-  loading: selectIsFetchingSubscriptions(state) || Boolean(Object.keys(selectSubscriptionsBeingFetched(state)).length),
+  loading: selectIsFetchingSubscriptions(state),
+  loadingSuggested: selectIsFetchingSuggested(state),
   subscribedChannels: selectSubscriptions(state),
+  suggestedChannels: selectSuggestedChannels(state),
   subscriptionsViewMode: makeSelectClientSetting(Constants.SETTING_SUBSCRIPTIONS_VIEW_MODE)(state),
   allSubscriptions: selectSubscriptionClaims(state),
   unreadSubscriptions: selectUnreadSubscriptions(state),
diff --git a/src/page/subscriptions/view.js b/src/page/subscriptions/view.js
index 46ca5e3..243c027 100644
--- a/src/page/subscriptions/view.js
+++ b/src/page/subscriptions/view.js
@@ -115,11 +115,12 @@ class SubscriptionsPage extends React.PureComponent {
 
   render() {
     const {
+      suggestedChannels,
       subscribedChannels,
       allSubscriptions,
-      loading,
       viewMode,
       doSetViewMode,
+      loading,
       loadingSuggested,
       firstRunCompleted,
       doCompleteFirstRun,
@@ -182,7 +183,7 @@ class SubscriptionsPage extends React.PureComponent {
 
         {hasSubscriptions && loading && (
           <View style={subscriptionsStyle.busyContainer}>
-            <ActivityIndicator size="large" color={Colors.LbryGreen} style={subscriptionsStyle.loading} />
+            <ActivityIndicator size="large" color={Colors.NextLbryGreen} style={subscriptionsStyle.loading} />
           </View>
         )}
 
@@ -209,8 +210,7 @@ class SubscriptionsPage extends React.PureComponent {
 
             {loadingSuggested && (
               <View style={subscriptionsStyle.centered}>
-                <ActivityIndicator size="large" colors={Colors.LbryGreen} style={subscriptionsStyle.loading} />
-                \\
+                <ActivityIndicator size="large" colors={Colors.NextLbryGreen} style={subscriptionsStyle.loading} />
               </View>
             )}
             {!loadingSuggested && <SuggestedSubscriptions navigation={navigation} />}
diff --git a/src/page/tag/view.js b/src/page/tag/view.js
index 843d4b9..dc02fac 100644
--- a/src/page/tag/view.js
+++ b/src/page/tag/view.js
@@ -78,7 +78,7 @@ class TagPage extends React.PureComponent {
   };
 
   handleTimeItemSelected = item => {
-    this.setState({ time: item.name });
+    this.setState({ currentTimeItem: item, time: item.name, showTimePicker: false });
   };
 
   render() {
diff --git a/src/page/trending/view.js b/src/page/trending/view.js
index 3891eb0..7ab602b 100644
--- a/src/page/trending/view.js
+++ b/src/page/trending/view.js
@@ -95,6 +95,7 @@ class TrendingPage extends React.PureComponent {
           orderBy={Constants.DEFAULT_ORDER_BY}
           trendingForAll={TRENDING_FOR_ITEMS[0].name === currentTrendingForItem.name}
           tags={followedTags.map(tag => tag.name)}
+          time={null}
           navigation={navigation}
           orientation={Constants.ORIENTATION_VERTICAL}
         />
diff --git a/src/redux/actions/performance.js b/src/redux/actions/performance.js
new file mode 100644
index 0000000..dcfc197
--- /dev/null
+++ b/src/redux/actions/performance.js
@@ -0,0 +1,96 @@
+// @flow
+import { NativeModules } from 'react-native';
+import {
+  ACTIONS,
+  batchActions,
+  buildURI,
+  doResolveUri,
+  doUpdateSearchQuery,
+  makeSelectSearchUris,
+  selectSuggestions,
+  makeSelectQueryWithOptions,
+  selectSearchValue,
+} from 'lbry-redux';
+
+let CONNECTION_STRING = 'https://lighthouse.lbry.com/';
+
+const handleNativeFetchResponse = str => {
+  const json = JSON.parse(str);
+  if (json.error) {
+    return Promise.reject(new Error(json.error));
+  }
+
+  return Promise.resolve(json);
+};
+
+// Use a native asyncTask to call the lighthouse api
+export const doNativeSearch = (
+  rawQuery: string, // pass in a query if you don't want to search for what's in the search bar
+  size: ?number, // only pass in if you don't want to use the users setting (ex: related content)
+  from: ?number,
+  isBackgroundSearch: boolean = false
+) => (dispatch: Dispatch, getState: GetState) => {
+  const query = rawQuery.replace(/^lbry:\/\//i, '').replace(/\//, ' ');
+
+  if (!query) {
+    dispatch({
+      type: ACTIONS.SEARCH_FAIL,
+    });
+    return;
+  }
+
+  const state = getState();
+  const queryWithOptions = makeSelectQueryWithOptions(query, size, from, isBackgroundSearch)(state);
+
+  // If we have already searched for something, we don't need to do anything
+  const urisForQuery = makeSelectSearchUris(queryWithOptions)(state);
+  if (urisForQuery && !!urisForQuery.length) {
+    return;
+  }
+
+  dispatch({
+    type: ACTIONS.SEARCH_START,
+  });
+
+  // If the user is on the file page with a pre-populated uri and they select
+  // the search option without typing anything, searchQuery will be empty
+  // We need to populate it so the input is filled on the search page
+  // isBackgroundSearch means the search is happening in the background, don't update the search query
+  if (!state.search.searchQuery && !isBackgroundSearch) {
+    dispatch(doUpdateSearchQuery(query));
+  }
+
+  const url = `${CONNECTION_STRING}search?${queryWithOptions}`;
+  NativeModules.Requests.get(url)
+    .then(handleNativeFetchResponse)
+    .then((data: Array<{ name: String, claimId: string }>) => {
+      const uris = [];
+      const actions = [];
+
+      data.forEach(result => {
+        if (result.name) {
+          const uri = buildURI({
+            claimName: result.name,
+            claimId: result.claimId,
+          });
+          actions.push(doResolveUri(uri));
+          uris.push(uri);
+        }
+      });
+
+      actions.push({
+        type: ACTIONS.SEARCH_SUCCESS,
+        data: {
+          query: queryWithOptions,
+          uris,
+        },
+      });
+      dispatch(batchActions(...actions));
+    })
+    .catch(e => {
+      console.log(e);
+      dispatch({
+        type: ACTIONS.SEARCH_FAIL,
+      });
+    });
+};
diff --git a/src/redux/actions/settings.js b/src/redux/actions/settings.js
index aa9f9e6..754f960 100644
--- a/src/redux/actions/settings.js
+++ b/src/redux/actions/settings.js
@@ -1,11 +1,17 @@
 import { ACTIONS } from 'lbry-redux';
 
 export function doSetClientSetting(key, value) {
-  return {
-    type: ACTIONS.CLIENT_SETTING_CHANGED,
-    data: {
-      key,
-      value,
-    },
+  return dispatch => {
+    dispatch({
+      type: ACTIONS.CLIENT_SETTING_CHANGED,
+      data: {
+        key,
+        value,
+      },
+    });
+
+    if (window.persistor) {
+      window.persistor.flush();
+    }
   };
 }
diff --git a/src/styles/filePage.js b/src/styles/filePage.js
index 812c414..ff01fa1 100644
--- a/src/styles/filePage.js
+++ b/src/styles/filePage.js
@@ -93,6 +93,11 @@ const filePageStyle = StyleSheet.create({
     fontSize: 14,
     color: Colors.LbryGreen,
   },
+  anonChannelName: {
+    fontFamily: 'Inter-UI-Regular',
+    fontSize: 14,
+    color: Colors.DescriptionGrey,
+  },
   publishDateText: {
     fontFamily: 'Inter-UI-SemiBold',
     fontSize: 12,
diff --git a/src/styles/subscriptions.js b/src/styles/subscriptions.js
index 8648421..f8c377d 100644
--- a/src/styles/subscriptions.js
+++ b/src/styles/subscriptions.js
@@ -197,7 +197,8 @@ const subscriptionsStyle = StyleSheet.create({
   },
   suggestedItemDetails: {
     marginLeft: 16,
-    flexDirection: 'row',
+    marginRight: 16,
+    flex: 0.8,
   },
   suggestedItemSubscribe: {
     backgroundColor: Colors.White,
@@ -209,12 +210,14 @@ const subscriptionsStyle = StyleSheet.create({
     fontFamily: 'Inter-UI-Regular',
     fontSize: 16,
     marginBottom: 4,
+    width: '85%',
   },
   suggestedItemName: {
     fontFamily: 'Inter-UI-SemiBold',
     fontSize: 14,
     marginBottom: 4,
     color: Colors.LbryGreen,
+    width: '95%',
   },
   suggestedItemTagList: {
     flexDirection: 'row',
diff --git a/src/utils/helper.js b/src/utils/helper.js
index ed41011..ae6f023 100644
--- a/src/utils/helper.js
+++ b/src/utils/helper.js
@@ -3,6 +3,8 @@ import { buildURI, isURIValid } from 'lbry-redux';
 import { doPopDrawerStack, doPushDrawerStack, doSetPlayerVisible } from 'redux/actions/drawer';
 import Constants, { DrawerRoutes } from 'constants'; // eslint-disable-line node/no-deprecated-api
 
+const tagNameLength = 10;
+
 function getRouteForSpecialUri(uri) {
   let targetRoute;
   const page = uri.substring(8).trim(); // 'lbry://?'.length == 8
@@ -191,6 +193,17 @@ export function formatTagTitle(title) {
   return title.charAt(0).toUpperCase() + title.substring(1);
 }
 
+export function formatTagName(name) {
+  if (!name) {
+    return null;
+  }
+  if (name.length <= tagNameLength) {
+    return name;
+  }
+
+  return name.substring(0, 7) + '...';
+}
+
 // i18n placeholder until we find a good react-native i18n module
 export function __(str) {
   return str;