diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md
new file mode 100644
index 0000000..a39dbba
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/custom.md
@@ -0,0 +1,34 @@
+---
+name: Custom issue template
+about: General issues, both bugs and features.
+title: ''
+labels: ''
+assignees: mssola
+---
+
+### Description
+
+Check out the [contribution guidelines](../CONTRIBUTING.md) file for some considerations before submitting a new issue.
+
+### Steps to reproduce
+
+1. First I did this...
+2. Then that...
+3. And this happened!
+
+- **Expected behavior**: I expected this to happen!
+- **Actual behavior**: But this happened...
+
+### user_agent version
+
+With a git commit SHA if possible.
+
+### Go version and interpreter
+
+```bash
+$ go version
+```
+
+### Operating system
+
+The operating system and the exact version you are using. If you are using Linux, it may be useful to know which distribution you are using and what did you do in order to install go.
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..22b8697
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,11 @@
+Provide a general description of the changes in your pull request. If this pull request fixes a known issue, please tag it as well (e.g.: `Fixes #1`).
+
+Before submitting a PR make sure the following things have been done (and denote this by checking the relevant checkboxes):
+
+- [ ] The commits are consistent with the [contribution guidelines](../CONTRIBUTING.md).
+- [ ] You've added tests (if possible) to cover your change(s).
+- [ ] All tests and style checkers are passing (`make ci`).
+- [ ] You've updated the [changelog](../CHANGELOG.md).
+- [ ] You've updated the [readme](../README.md) (if relevant).
+
+Thanks for contributing to user_agent!
diff --git a/.travis.yml b/.travis.yml
index 96f43d1..3bc82c0 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,4 +1,12 @@
 language: go
+
+git:
+  depth: false
+
+arch:
+  - amd64
+  - ppc64le
+
 go:
   - 1.4.x
   - 1.5.x
@@ -6,8 +14,22 @@ go:
   - 1.7.x
   - 1.8.x
   - 1.9.x
+  - 1.10.x
+  - 1.11.x
+  - 1.12.x
+  - 1.13.x
+  - 1.14.x
   - 1.x
   - tip
 matrix:
   allow_failures:
     - go: tip
+  exclude:
+    - go: 1.4.x
+      arch: ppc64le
+
+before_install:
+  - chmod +x ./ci/install.sh && ./ci/install.sh
+
+script:
+  - make ci
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b994361..90730fe 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,39 +1,56 @@
 # Changelog
 
+## Not yet released
+
+## 0.5.3
+
+- Fix detection of Firefox on iPad. See [42e4a8f39125](https://github.com/mssola/user_agent/commit/42e4a8f39125a6680fb5367a4602963f1351e069).
+- Fix detection of Linux ARM-based Android. See [3b0e113c8047](https://github.com/mssola/user_agent/commit/3b0e113c804708c01de00c27aae07d2acfee40d8).
+- Add detection of Chromium Edge on Windows. See [ea81f1e9d61c](https://github.com/mssola/user_agent/commit/ea81f1e9d61c094df4156690a8f4d5481b0d6c4a).
+- Add detection of OkHttp. See [6b33e248e796](https://github.com/mssola/user_agent/commit/6b33e248e7969cf3e76128a34d33be88d4eb0dc8).
+
+## 0.5.2
+
+- Detect Electron. See [commit](https://github.com/mssola/user_agent/commit/1a36963d74c0efca7de80dc7518a0958c66b3c4f).
+- Add support for both http and https site urls. See [commit](https://github.com/mssola/user_agent/commit/d78bf2c5886a0ab7e1cf90b68c808fe3e3ab6f8c).
+- Add more support for BingBot. See [commit](https://github.com/mssola/user_agent/commit/c6402a7b8aefdc4acfbf1e7f3b43eac0b266e49e).
+- Add a test case for Firefox focus on iOS. See [commit](https://github.com/mssola/user_agent/commit/a1e9c19d5a6887a17cef1d249118ccbd45cf4c0b).
+- Detect iMessage-Preview. See [commit](https://github.com/mssola/user_agent/commit/e8f5e19ded9711ee1f4b43218b9d57d00ef5c26a).
+
 ## 0.5.1
 
-- 00a868fa17e7 add Firefox for iOS
-- 8c16c37f4e07 Add go.mod
-- 7e313fc62553 Use CodeLingo to Address Further Issues
-- 95b0c164394f Fix function comments based on best practices from Effective Go
-- 1df9e04ee4f5 test: mobile Yandex Browser
-- 6eb76c60b5e8 Add Yandex browser
-- 8b3999083770 Updating license notice
-- 82f141dea4a8 Detect Chrome for iOS correctly
-- 5723c361ed97 Facebook App Handling
-- 57c32981bd5f Add a new google bot user agent format
+- add Firefox for iOS. See [commit](https://github.com/mssola/user_agent/commit/00a868fa17e7).
+- Add go.mod. See [commit](https://github.com/mssola/user_agent/commit/8c16c37f4e07).
+- Use CodeLingo to Address Further Issues. See [commit](https://github.com/mssola/user_agent/commit/7e313fc62553).
+- Fix function comments based on best practices from Effective Go. See [commit](https://github.com/mssola/user_agent/commit/95b0c164394f).
+- test: mobile Yandex Browser. See [commit](https://github.com/mssola/user_agent/commit/1df9e04ee4f5).
+- Add Yandex browser. See [commit](https://github.com/mssola/user_agent/commit/6eb76c60b5e8).
+- Updating license notice. See [commit](https://github.com/mssola/user_agent/commit/8b3999083770).
+- Detect Chrome for iOS correctly. See [commit](https://github.com/mssola/user_agent/commit/82f141dea4a8).
+- Facebook App Handling. See [commit](https://github.com/mssola/user_agent/commit/5723c361ed97).
+- Add a new google bot user agent format. See [commit](https://github.com/mssola/user_agent/commit/57c32981bd5f).
 
 ## 0.5.0
 
 ### Newly supported and improvements
 
-- f659b9863849 Added support for Microsoft Edge
-- 783ec61292ae Precompile regular expressions
-- 78413629666f Added support for Dalvik user agent parsing
-- 0319fcf00bfd Improved bot support (also e25e612b37a4)
-- 6e7843e05771 Add Chromium support and Ubuntu specific tests
-- 3335cae017e7 Add OSInfo function to user agent (also 7286ca6abc28)
-- 6fe362d7cd64 Detect updated UA for Googlebot
-- 1438bfba89d7 Adds the Adsense bot (mobile)
+- Added support for Microsoft Edge. See [commit](https://github.com/mssola/user_agent/commit/f659b9863849).
+- Precompile regular expressions. See [commit](https://github.com/mssola/user_agent/commit/783ec61292ae).
+- Added support for Dalvik user agent parsing. See [commit](https://github.com/mssola/user_agent/commit/78413629666f).
+- Improved bot support (also e25e612b37a4). See [commit](https://github.com/mssola/user_agent/commit/0319fcf00bfd).
+- Add Chromium support and Ubuntu specific tests. See [commit](https://github.com/mssola/user_agent/commit/6e7843e05771).
+- Add OSInfo function to user agent (also 7286ca6abc28). See [commit](https://github.com/mssola/user_agent/commit/3335cae017e7).
+- Detect updated UA for Googlebot. See [commit](https://github.com/mssola/user_agent/commit/6fe362d7cd64).
+- Adds the Adsense bot (mobile). See [commit](https://github.com/mssola/user_agent/commit/1438bfba89d7).
 
 ### Fixes
 
-- 8d86c2cf88bf Fixed bug when extracting windows 10
-- 9d00ff9e4202 Fixed bug on mobile Firefox browsers running on Android OS versions that report their version number inline.
+- Fixed bug when extracting windows 10. See [commit](https://github.com/mssola/user_agent/commit/8d86c2cf88bf).
+- Fixed bug on mobile Firefox browsers running on Android OS versions that report their version number inline.. See [commit](https://github.com/mssola/user_agent/commit/9d00ff9e4202).
 
 ### Other
 
-63395b193f8812526305bec75ea7117262a124aa Improved testing infrastructure (also 63395b193f8812526305bec75ea7117262a124aa)
+- Improved testing infrastructure. See [commit](https://github.com/mssola/user_agent/commit/63395b193f8812526305bec75ea7117262a124aa).
 
 ## Older releases
 
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..f982c3b
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,78 @@
+# Contributing to user_agent
+
+## Check that your changes do not break anything
+
+You can safely run the `ci` target locally:
+
+```
+$ make ci
+```
+
+This will run all the make targets that will also be run on the CI, which are
+described below.
+
+### Running tests
+
+Call the `test` make target:
+
+```bash
+$ make test
+```
+
+### Checking the style
+
+This project uses some standard tools in order to check the Go style. You can
+run them by calling the `validate-go` make target:
+
+```bash
+$ make validate-go
+```
+
+This target is included inside of the `validate` one.
+
+### Git validation
+
+In order to ensure that the git log is as maintainable as possible, the
+[git-validation](https://github.com/vbatts/git-validation) tool is used. You can
+install this tool by running:
+
+```bash
+$ go get -u github.com/vbatts/git-validation
+```
+
+If you already have this tool installed, then simply perform:
+
+```bash
+$ make git-validation
+```
+
+One of the things you will notice is that it will check that the commits have a
+sign off, that is, that you have used the `-s` flag when calling `git
+commit`. This is a lightweight way for contributors to certify that they wrote
+or otherwise have the right to submit the code they are contributing into this
+project.
+
+This target is included inside of the `validate` one.
+
+## Issue reporting
+
+I'm using [Github](https://github.com/mssola/user_agent) in order to host the
+code. Thus, in order to report issues you can do it on its [issue
+tracker](https://github.com/mssola/user_agent/issues). A couple of notes on
+reports:
+
+- Check that the issue has not already been reported or fixed in `master`.
+- Try to be concise and precise in your description of the problem.
+- Provide a step by step guide on how to reproduce this problem.
+- Provide the version you are using (the commit SHA, if possible).
+
+## Pull requests
+
+- Write a [good commit message](https://chris.beams.io/posts/git-commit/).
+- Make sure that tests are passing on your local machine (it will also be
+checked by the CI system whenever you submit the pull request).
+- Update the [changelog](./CHANGELOG.md).
+- Try to use the same coding conventions as used in this project.
+- Open a pull request with *only* one subject and a clear title and
+description. Refrain from submitting pull requests with tons of different
+unrelated commits.
diff --git a/LICENSE b/LICENSE
index 739e32b..b07e933 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2012-2019 Miquel Sabaté Solà
+Copyright (c) 2012-2021 Miquel Sabaté Solà
 
 Permission is hereby granted, free of charge, to any person obtaining
 a copy of this software and associated documentation files (the
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..89c5f4a
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,53 @@
+GO ?= go
+GO_SRC = $(shell find . -name \*.go)
+
+.DEFAULT: build
+build: $(GO_SRC)
+	@$(GO) build
+
+#
+# Unit & integration tests.
+#
+
+.PHONY: test
+test:
+	@$(GO) test
+
+.PHONY: bench
+bench:
+	@$(GO) test -bench=.
+
+#
+# Validation tools.
+#
+
+EPOCH_COMMIT ?= 2046da2a89bd
+.PHONY: git-validation
+git-validation:
+ifeq (, $(shell which git-validation 2> /dev/null))
+	@echo "You don't have 'git-validation' installed, consider installing it (see the CONTRIBUTING.md file)."
+else
+	@git-validation -q -range $(EPOCH_COMMIT)..HEAD -travis-pr-only=false
+endif
+
+.PHONY: validate-go
+validate-go:
+	@which gofmt >/dev/null 2>/dev/null || (echo "ERROR: gofmt not found." && false)
+	@test -z "$$(gofmt -s -l . | grep -vE '^vendor/' | tee /dev/stderr)"
+	@chmod +x ci/lint.sh
+	@./ci/lint.sh
+# Go 1.4.x does not have go vet, so there is no point on trying.
+ifneq ("$(TRAVIS_GO_VERSION)","1.4.x")
+	@go doc cmd/vet >/dev/null 2>/dev/null || (echo "ERROR: go vet not found." && false)
+	@test -z "$$(go vet . | grep -v vendor | tee /dev/stderr)"
+endif
+
+.PHONY: validate
+validate: git-validation validate-go
+
+#
+# Travis-CI
+#
+
+.PHONY: ci
+ci: build validate test
diff --git a/README.md b/README.md
index 35d050c..6ccedde 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,15 @@
 
-# UserAgent [![Build Status](https://travis-ci.org/mssola/user_agent.png?branch=master)](https://travis-ci.org/mssola/user_agent) [![GoDoc](https://godoc.org/github.com/mssola/user_agent?status.png)](http://godoc.org/github.com/mssola/user_agent)
+<p align="center">
+  <a href="https://travis-ci.org/mssola/user_agent" title="Travis CI status for the master branch"><img src="https://travis-ci.org/mssola/user_agent.svg?branch=master" alt="Build Status for master branch" /></a>
+  <a href="http://godoc.org/github.com/mssola/user_agent" title="godoc.org page"><img src="https://godoc.org/github.com/mssola/user_agent?status.png" alt="godoc.org page" /></a>
+  <a href="https://en.wikipedia.org/wiki/MIT_License" rel="nofollow"><img alt="MIT" src="https://img.shields.io/badge/license-MIT-blue.svg" style="max-width:100%;"></a>
+</p>
 
+---
 
-UserAgent is a Go library that parses HTTP User Agents.
+UserAgent is a Go library that parses HTTP User Agents. As an example:
 
-## Usage
-
-~~~ go
+```go
 package main
 
 import (
@@ -46,6 +49,47 @@ func main() {
     fmt.Printf("%v\n", name)          // => Googlebot
     fmt.Printf("%v\n", version)       // => 2.1
 }
-~~~
+```
+
+If you want to read the full API documentation simply check
+[godoc](http://godoc.org/github.com/mssola/user_agent).
+
+## Installation
+
+```
+go get -u github.com/mssola/user_agent
+```
+
+## Contributing
+
+Do you want to contribute with code, or to report an issue you are facing? Read
+the [CONTRIBUTING.md](./CONTRIBUTING.md) file.
+
+## [Changelog](https://pbs.twimg.com/media/DJDYCcLXcAA_eIo?format=jpg&name=small)
+
+Read the [CHANGELOG.md](./CHANGELOG.md) file.
+
+## License
+
+```
+Copyright (c) 2012-2021 Miquel Sabaté Solà
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
 
-Copyright &copy; 2012-2019 Miquel Sabaté Solà, released under the MIT License.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+```
diff --git a/all_test.go b/all_test.go
index 1913b8c..3480110 100644
--- a/all_test.go
+++ b/all_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2012-2019 Miquel Sabaté Solà <mikisabate@gmail.com>
+// Copyright (C) 2012-2021 Miquel Sabaté Solà <mikisabate@gmail.com>
 // This file is licensed under the MIT license.
 // See the LICENSE file.
 
@@ -44,6 +44,21 @@ var uastrings = []struct {
 		ua:       "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)",
 		expected: "Mozilla:5.0 Browser:bingbot-2.0 Bot:true Mobile:false",
 	},
+	{
+		title:    "BingBotSmartphone(iPhone)",
+		ua:       "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)",
+		expected: "Mozilla:5.0 Browser:bingbot-2.0 Bot:true Mobile:true",
+	},
+	{
+		title:    "BingBotSmartphone(Android)",
+		ua:       "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 Edg/80.0.345.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)",
+		expected: "Mozilla:5.0 Browser:bingbot-2.0 Bot:true Mobile:true",
+	},
+	{
+		title:    "BingBotEmulateMozilla",
+		ua:       "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/41.0.2272.96 Mobile Safari/537.36 Edg/80.0.345.0",
+		expected: "Mozilla:5.0 Browser:bingbot-2.0 Bot:true Mobile:true",
+	},
 	{
 		title:    "BaiduBot",
 		ua:       "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)",
@@ -104,6 +119,16 @@ var uastrings = []struct {
 		ua:       "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 (compatible; AdsBot-Google-Mobile; +http://www.google.com/mobile/adsbot.html)",
 		expected: "Mozilla:5.0 Browser:AdsBot-Google-Mobile Bot:true Mobile:true",
 	},
+	{
+		title:    "APIs-Google",
+		ua:       "APIs-Google (+https://developers.google.com/webmasters/APIs-Google.html)",
+		expected: "Browser:APIs-Google Bot:true Mobile:false",
+	},
+	{
+		title:    "iMessage-preview",
+		ua:       "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/601.2.4 (KHTML, like Gecko) Version/9.0.1 Safari/601.2.4 facebookexternalhit/1.1 Facebot Twitterbot/1.0",
+		expected: "Mozilla:5.0 Platform:Macintosh Browser:iMessage-Preview-9.0.1 Bot:true Mobile:false",
+	},
 
 	// Internet Explorer
 	{
@@ -185,6 +210,14 @@ var uastrings = []struct {
 		expected: "Mozilla:5.0 Platform:Windows OS:Windows Phone 10.0 Browser:Edge-12.10240 Engine:EdgeHTML Bot:false Mobile:true",
 	},
 
+	// Microsoft Chromium Edge
+	{
+		title:      "EdgeDesktop",
+		ua:         "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36 Edg/83.0.478.37",
+		expected:   "Mozilla:5.0 Platform:Windows OS:Windows 10 Browser:Edge-83.0.478.37 Engine:AppleWebKit-537.36 Bot:false Mobile:false",
+		expectedOS: &OSInfo{"Windows 10", "Windows", "10"},
+	},
+
 	// Gecko
 	{
 		title:      "FirefoxMac",
@@ -404,6 +437,11 @@ var uastrings = []struct {
 		ua:       "curl/7.28.1",
 		expected: "Browser:curl-7.28.1 Bot:false Mobile:false",
 	},
+	{
+		title:    "OkHttp",
+		ua:       "okhttp/4.2.2",
+		expected: "Browser:OkHttp-4.2.2 Bot:false Mobile:true",
+	},
 
 	// WebKit
 	{
@@ -541,6 +579,21 @@ var uastrings = []struct {
 		ua:       "Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/1.0 Mobile/12F69 Safari/600.1.4",
 		expected: "Mozilla:5.0 Platform:iPhone OS:CPU iPhone OS 8_3 like Mac OS X Browser:Firefox-1.0 Engine:AppleWebKit-600.1.4 Bot:false Mobile:true",
 	},
+	{
+		title:    "Firefox Focus for iOS",
+		ua:       "Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/7.0.4 Mobile/16B91 Safari/605.1.15",
+		expected: "Mozilla:5.0 Platform:iPhone OS:CPU iPhone OS 12_1 like Mac OS X Browser:Firefox-7.0.4 Engine:AppleWebKit-605.1.15 Bot:false Mobile:true",
+	},
+	{
+		title:    "Firefox on iPad",
+		ua:       "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/24.1 Safari/605.1.15",
+		expected: "Mozilla:5.0 Platform:iPad OS:Intel Mac OS X 10.15 Browser:Firefox-24.1 Engine:AppleWebKit-605.1.15 Bot:false Mobile:true",
+	},
+	{
+		title:    "Electron",
+		ua:       "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) CozyDrive/3.17.0  Chrome/73.0.3683.119 Electron/5.0.0 Safari/537.36",
+		expected: "Mozilla:5.0 Platform:Windows OS:Windows 10 Browser:Electron-5.0.0 Engine:AppleWebKit-537.36 Bot:false Mobile:false",
+	},
 
 	// Dalvik
 	{
@@ -584,6 +637,18 @@ var uastrings = []struct {
 		ua:       "[FBAN/FB4A;FBAV/16.0.0.20.15;FBBV/4061184;FBDM/{density=1.5,width=540,height=960};FBLC/en_US;FB_FW/2;FBCR/MY CELCOM;FBPN/com.facebook.katana;FBDV/Lenovo A850+;FBSV/4.2.2;FBOP/1;FBCA/armeabi-v7a:armeabi;]",
 		expected: "Bot:false Mobile:false",
 	},
+
+	// arm_64
+	{
+		title:    "Samsung S7 Edge - YaBrowser",
+		ua:       "Mozilla/5.0 (Linux; arm_64; Android 8.0.0; SM-G935F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 YaBrowser/19.12.3.101.00 Mobile Safari/537.36",
+		expected: "Mozilla:5.0 Platform:Linux OS:Android 8.0.0 Localization:SM-G935F Browser:YaBrowser-19.12.3.101.00 Engine:AppleWebKit-537.36 Bot:false Mobile:true",
+	},
+	{
+		title:    "HUAWEI P20 lite - YaBrowser",
+		ua:       "Mozilla/5.0 (Linux; arm_64; Android 9; ANE-LX2J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.136 YaBrowser/20.2.6.114.00 Mobile Safari/537.36",
+		expected: "Mozilla:5.0 Platform:Linux OS:Android 9 Localization:ANE-LX2J Browser:YaBrowser-20.2.6.114.00 Engine:AppleWebKit-537.36 Bot:false Mobile:true",
+	},
 }
 
 // Internal: beautify the UserAgent reference into a string so it can be
diff --git a/bot.go b/bot.go
index 4bd70bc..9a79076 100644
--- a/bot.go
+++ b/bot.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2019 Miquel Sabaté Solà <mikisabate@gmail.com>
+// Copyright (C) 2014-2021 Miquel Sabaté Solà <mikisabate@gmail.com>
 // This file is licensed under the MIT license.
 // See the LICENSE file.
 
@@ -9,7 +9,7 @@ import (
 	"strings"
 )
 
-var botFromSiteRegexp = regexp.MustCompile("http://.+\\.\\w+")
+var botFromSiteRegexp = regexp.MustCompile("http[s]?://.+\\.\\w+")
 
 // Get the name of the bot from the website that may be in the given comment. If
 // there is no website in the comment, then an empty string is returned.
@@ -42,18 +42,41 @@ func getFromSite(comment []string) string {
 }
 
 // Returns true if the info that we currently have corresponds to the Google
-// mobile bot. This function also modifies some attributes in the receiver
+// or Bing mobile bot. This function also modifies some attributes in the receiver
 // accordingly.
-func (p *UserAgent) googleBot() bool {
-	// This is a hackish way to detect Google's mobile bot (Googlebot, AdsBot-Google-Mobile, etc.).
-	// See https://support.google.com/webmasters/answer/1061943
-	if strings.Index(p.ua, "Google") != -1 {
+func (p *UserAgent) googleOrBingBot() bool {
+	// This is a hackish way to detect
+	// Google's mobile bot (Googlebot, AdsBot-Google-Mobile, etc.)
+	// (See https://support.google.com/webmasters/answer/1061943)
+	// and Bing's mobile bot
+	// (See https://www.bing.com/webmaster/help/which-crawlers-does-bing-use-8c184ec0)
+	if strings.Index(p.ua, "Google") != -1 || strings.Index(p.ua, "bingbot") != -1 {
 		p.platform = ""
 		p.undecided = true
 	}
 	return p.undecided
 }
 
+// Returns true if we think that it is iMessage-Preview. This function also
+// modifies some attributes in the receiver accordingly.
+func (p *UserAgent) iMessagePreview() bool {
+	// iMessage-Preview doesn't advertise itself. We have a to rely on a hack
+	// to detect it: it impersonates both facebook and twitter bots.
+	// See https://medium.com/@siggi/apples-imessage-impersonates-twitter-facebook-bots-when-scraping-cef85b2cbb7d
+	if strings.Index(p.ua, "facebookexternalhit") == -1 {
+		return false
+	}
+	if strings.Index(p.ua, "Twitterbot") == -1 {
+		return false
+	}
+	p.bot = true
+	p.browser.Name = "iMessage-Preview"
+	p.browser.Engine = ""
+	p.browser.EngineVersion = ""
+	// We don't set the mobile flag because iMessage can be on iOS (mobile) or macOS (not mobile).
+	return true
+}
+
 // Set the attributes of the receiver as given by the parameters. All the other
 // parameters are set to empty.
 func (p *UserAgent) setSimple(name, version string, bot bool) {
diff --git a/browser.go b/browser.go
index 2eb55ff..a31815d 100644
--- a/browser.go
+++ b/browser.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2012-2019 Miquel Sabaté Solà <mikisabate@gmail.com>
+// Copyright (C) 2012-2021 Miquel Sabaté Solà <mikisabate@gmail.com>
 // This file is licensed under the MIT license.
 // See the LICENSE file.
 
@@ -11,7 +11,7 @@ import (
 
 var ie11Regexp = regexp.MustCompile("^rv:(.+)$")
 
-// A struct containing all the information that we might be
+// Browser is a struct containing all the information that we might be
 // interested from the browser.
 type Browser struct {
 	// The name of the browser's engine.
@@ -59,12 +59,26 @@ func (p *UserAgent) detectBrowser(sections []section) {
 			}
 			p.browser.Version = sections[sectionIndex].version
 			if engine.name == "AppleWebKit" {
+				for _, comment := range engine.comment {
+					if len(comment) > 5 &&
+						(strings.HasPrefix(comment, "Googlebot") || strings.HasPrefix(comment, "bingbot")) {
+						p.undecided = true
+						break
+					}
+				}
 				switch sections[slen-1].name {
 				case "Edge":
 					p.browser.Name = "Edge"
 					p.browser.Version = sections[slen-1].version
 					p.browser.Engine = "EdgeHTML"
 					p.browser.EngineVersion = ""
+				case "Edg":
+					if p.undecided != true {
+						p.browser.Name = "Edge"
+						p.browser.Version = sections[slen-1].version
+						p.browser.Engine = "AppleWebKit"
+						p.browser.EngineVersion = sections[slen-2].version
+					}
 				case "OPR":
 					p.browser.Name = "Opera"
 					p.browser.Version = sections[slen-1].version
@@ -74,20 +88,27 @@ func (p *UserAgent) detectBrowser(sections []section) {
 						p.browser.Name = "YaBrowser"
 						p.browser.Version = sections[slen-3].version
 					default:
-						switch sections[sectionIndex].name {
-						case "Chrome", "CriOS":
-							p.browser.Name = "Chrome"
-						case "Chromium":
-							p.browser.Name = "Chromium"
-						case "FxiOS":
-							p.browser.Name = "Firefox"
+						switch sections[slen-2].name {
+						case "Electron":
+							p.browser.Name = "Electron"
+							p.browser.Version = sections[slen-2].version
 						default:
-							p.browser.Name = "Safari"
+							switch sections[sectionIndex].name {
+							case "Chrome", "CriOS":
+								p.browser.Name = "Chrome"
+							case "Chromium":
+								p.browser.Name = "Chromium"
+							case "FxiOS":
+								p.browser.Name = "Firefox"
+							default:
+								p.browser.Name = "Safari"
+							}
 						}
 					}
 					// It's possible the google-bot emulates these now
 					for _, comment := range engine.comment {
-						if len(comment) > 5 && strings.HasPrefix(comment, "Googlebot") {
+						if len(comment) > 5 &&
+							(strings.HasPrefix(comment, "Googlebot") || strings.HasPrefix(comment, "bingbot")) {
 							p.undecided = true
 							break
 						}
diff --git a/ci/install.sh b/ci/install.sh
new file mode 100755
index 0000000..0c38118
--- /dev/null
+++ b/ci/install.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright (C) 2012-2021 Miquel Sabaté Solà <mikisabate@gmail.com>
+# This file is licensed under the MIT license.
+# See the LICENSE file.
+
+# Hack so we work around old versions of Go which are no longer supported by
+# linting tools that we use in this project.
+
+case "${TRAVIS_GO_VERSION:2:1}" in
+    "4" | "5" | "6" | "7" | "8")
+        echo "This version of Go is not going to use linting tools."
+        ;;
+    *)
+        go get -u github.com/vbatts/git-validation
+        go get -u golang.org/x/lint/golint
+        ;;
+esac
diff --git a/ci/lint.sh b/ci/lint.sh
new file mode 100755
index 0000000..56b6869
--- /dev/null
+++ b/ci/lint.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+# Copyright (C) 2012-2021 Miquel Sabaté Solà <mikisabate@gmail.com>
+# This file is licensed under the MIT license.
+# See the LICENSE file.
+
+# Idea taken from: https://github.com/golang/lint/issues/263#issuecomment-590070899
+#
+# The thing here is that I named the package with an underscore, and that was
+# done way before coding conventions and such were enforced with tools like
+# golint, so these kinds of rules were not taken into consideration.
+#
+# For compatibility reasons I'm wary of renaming this package, so I'll just
+# ignore this rule.
+
+# Hack so we work around old versions of Go which are no longer supported by
+# linting tools that we use in this project.
+
+case "${TRAVIS_GO_VERSION:2:1}" in
+    "4" | "5" | "6" | "7" | "8")
+        echo "This version of Go is not going to use golint."
+        exit 0
+        ;;
+esac
+
+which golint >/dev/null 2>/dev/null || (echo "ERROR: golint not found." && false)
+
+# Patterns to be ignored from the go lint output
+IGNORED_PATTERNS=(
+    "don't use an underscore in package name"
+)
+
+# Patterns joined into a regular expression
+REGEX=$(printf "|(%s)" "${IGNORED_PATTERNS[@]}")
+REGEX=${REGEX:1}
+
+# Execute go lint on all the files and filter output by the regualr expression
+output=$( ( (golint ./... | egrep -v "$REGEX") 2>&1 ) | tee /dev/fd/2);
+if [ -z "$output" ]
+then
+    exit 0
+else
+    exit 1
+fi
diff --git a/codelingo.yaml b/codelingo.yaml
deleted file mode 100644
index 3e61e76..0000000
--- a/codelingo.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-tenets:
-  - import: codelingo/effective-go/comment-first-word-as-subject
-  - import: codelingo/effective-go/avoid-annotations-in-comments
-  - import: codelingo/effective-go/underscores-in-name
-  - import: codelingo/go/golint
-  - import: codelingo/go/global-var
-  - import: codelingo/go/tested
-  - import: codelingo/lightning-network-daemon
\ No newline at end of file
diff --git a/debian/changelog b/debian/changelog
index 3b96661..b7248dd 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,11 +1,12 @@
-golang-github-mssola-user-agent (0.5.1-2) UNRELEASED; urgency=medium
+golang-github-mssola-user-agent (0.5.3-1) UNRELEASED; urgency=medium
 
   * Bump debhelper from old 12 to 13.
   * Set upstream metadata fields: Bug-Database, Bug-Submit, Repository,
     Repository-Browse.
   * Update standards version to 4.6.0, no changes needed.
+  * New upstream release.
 
- -- Debian Janitor <janitor@jelmer.uk>  Fri, 01 Oct 2021 05:31:59 -0000
+ -- Debian Janitor <janitor@jelmer.uk>  Mon, 14 Mar 2022 07:08:40 -0000
 
 golang-github-mssola-user-agent (0.5.1-1) unstable; urgency=medium
 
diff --git a/operating_systems.go b/operating_systems.go
index 0500bd3..123078c 100644
--- a/operating_systems.go
+++ b/operating_systems.go
@@ -1,12 +1,15 @@
-// Copyright (C) 2012-2019 Miquel Sabaté Solà <mikisabate@gmail.com>
+// Copyright (C) 2012-2021 Miquel Sabaté Solà <mikisabate@gmail.com>
 // This file is licensed under the MIT license.
 // See the LICENSE file.
 
 package user_agent
 
-import "strings"
+import (
+	"strings"
+)
 
-// Represents full information on the operating system extracted from the user agent.
+// OSInfo represents full information on the operating system extracted from the
+// user agent.
 type OSInfo struct {
 	// Full name of the operating system. This is identical to the output of ua.OS()
 	FullName string
@@ -75,7 +78,7 @@ func webkit(p *UserAgent, comment []string) {
 			p.browser.Name = "Android"
 		}
 		if len(comment) > 1 {
-			if comment[1] == "U" {
+			if comment[1] == "U" || comment[1] == "arm_64" {
 				if len(comment) > 2 {
 					p.os = comment[2]
 				} else {
@@ -89,7 +92,7 @@ func webkit(p *UserAgent, comment []string) {
 		if len(comment) > 3 {
 			p.localization = comment[3]
 		} else if len(comment) == 3 {
-			_ = p.googleBot()
+			_ = p.googleOrBingBot()
 		}
 	} else if len(comment) > 0 {
 		if len(comment) > 3 {
@@ -100,7 +103,7 @@ func webkit(p *UserAgent, comment []string) {
 		} else if len(comment) < 2 {
 			p.localization = comment[0]
 		} else if len(comment) < 3 {
-			if !p.googleBot() {
+			if !p.googleOrBingBot() && !p.iMessagePreview() {
 				p.os = normalizeOS(comment[1])
 			}
 		} else {
@@ -113,6 +116,12 @@ func webkit(p *UserAgent, comment []string) {
 			}
 		}
 	}
+
+	// Special case for Firefox on iPad, where the platform is advertised as Macintosh instead of iPad
+	if p.platform == "Macintosh" && p.browser.Engine == "AppleWebKit" && p.browser.Name == "Firefox" {
+		p.platform = "iPad"
+		p.mobile = true
+	}
 }
 
 // Guess the OS, the localization and if this is a mobile device
@@ -122,7 +131,7 @@ func webkit(p *UserAgent, comment []string) {
 // argument is a slice of strings containing the comment.
 func gecko(p *UserAgent, comment []string) {
 	if len(comment) > 1 {
-		if comment[1] == "U" {
+		if comment[1] == "U" || comment[1] == "arm_64" {
 			if len(comment) > 2 {
 				p.os = normalizeOS(comment[2])
 			} else {
@@ -276,6 +285,10 @@ func (p *UserAgent) detectOS(s section) {
 		if len(s.comment) > 0 {
 			dalvik(p, s.comment)
 		}
+	} else if s.name == "okhttp" {
+		p.mobile = true
+		p.browser.Name = "OkHttp"
+		p.browser.Version = s.version
 	} else {
 		// Check whether this is a bot or just a weird browser.
 		p.undecided = true
diff --git a/user_agent.go b/user_agent.go
index 09b4714..f96d364 100644
--- a/user_agent.go
+++ b/user_agent.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2012-2019 Miquel Sabaté Solà <mikisabate@gmail.com>
+// Copyright (C) 2012-2021 Miquel Sabaté Solà <mikisabate@gmail.com>
 // This file is licensed under the MIT license.
 // See the LICENSE file.
 
@@ -125,7 +125,8 @@ func (p *UserAgent) initialize() {
 	p.undecided = false
 }
 
-// Parse the given User-Agent string and get the resulting UserAgent object.
+// New parses the given User-Agent string and get the resulting UserAgent
+// object.
 //
 // Returns an UserAgent object that has been initialized after parsing
 // the given User-Agent string.