diff --git a/frontend_tests/zjsunit/output.js b/frontend_tests/zjsunit/output.js
index abb5c90818..9fa7ce48a1 100644
--- a/frontend_tests/zjsunit/output.js
+++ b/frontend_tests/zjsunit/output.js
@@ -39,6 +39,7 @@ function stylesheets() {
     data += '\n';
     data += '\n';
     data += '\n';
+    data += '\n';
     data += '\n';
     data += '\n';
     data += '\n';
diff --git a/package.json b/package.json
index cbb2c2e3a1..aa52f96999 100644
--- a/package.json
+++ b/package.json
@@ -54,6 +54,7 @@
     "svgo": "0.7.2",
     "swagger-parser": "3.4.1",
     "tslint": "5.3.2",
+    "webfonts-generator": "0.4.0",
     "webpack-dev-server": "2.4.1",
     "xmlhttprequest": "1.5.0"
   },
diff --git a/static/assets/icons/bot.svg b/static/assets/icons/bot.svg
new file mode 100644
index 0000000000..361e048773
--- /dev/null
+++ b/static/assets/icons/bot.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/icons/fonts/template.hbs b/static/icons/fonts/template.hbs
new file mode 100644
index 0000000000..95d89206e7
--- /dev/null
+++ b/static/icons/fonts/template.hbs
@@ -0,0 +1,39 @@
+/* Custom Zulip icons generated with ./tools/generate-custom-icon-webfont */
+
+@font-face {
+    font-family: '{{fontName}}';
+    src: {{{src}}};
+    font-weight: normal;
+    font-style: normal;
+}
+
+i{{baseSelector}} {
+    font-family: '{{fontName}}' !important;
+    font-style: normal !important;
+    font-weight: normal !important;
+    font-variant: normal !important;
+    text-transform: none;
+    font-size: inherit;
+    line-height: 100%;
+
+    text-decoration: inherit;
+    text-rendering: auto;
+    display: inline-block;
+    speak: none;
+
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+{{baseSelector}}::before {
+    font-family: 'zulip-icons' !important;
+    font-style: normal;
+    font-weight: normal !important;
+    vertical-align: top;
+}
+
+{{#each codepoints}}
+{{../baseSelector}}.{{../classPrefix}}{{@key}}::before {
+    content: "\\{{this}}";
+}
+{{/each}}
diff --git a/static/icons/fonts/zulip-icons.eot b/static/icons/fonts/zulip-icons.eot
new file mode 100755
index 0000000000..7d3096bed2
Binary files /dev/null and b/static/icons/fonts/zulip-icons.eot differ
diff --git a/static/icons/fonts/zulip-icons.svg b/static/icons/fonts/zulip-icons.svg
new file mode 100755
index 0000000000..5fda42219c
--- /dev/null
+++ b/static/icons/fonts/zulip-icons.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/icons/fonts/zulip-icons.ttf b/static/icons/fonts/zulip-icons.ttf
new file mode 100755
index 0000000000..56eab56391
Binary files /dev/null and b/static/icons/fonts/zulip-icons.ttf differ
diff --git a/static/icons/fonts/zulip-icons.woff b/static/icons/fonts/zulip-icons.woff
new file mode 100755
index 0000000000..85c2d545b5
Binary files /dev/null and b/static/icons/fonts/zulip-icons.woff differ
diff --git a/static/icons/fonts/zulip-icons.woff2 b/static/icons/fonts/zulip-icons.woff2
new file mode 100644
index 0000000000..f3d090fa4b
Binary files /dev/null and b/static/icons/fonts/zulip-icons.woff2 differ
diff --git a/static/icons/style.css b/static/icons/style.css
new file mode 100755
index 0000000000..79caac9147
--- /dev/null
+++ b/static/icons/style.css
@@ -0,0 +1,39 @@
+/* Custom Zulip icons generated with ./tools/generate-custom-icon-webfont */
+
+@font-face {
+    font-family: 'zulip-icons';
+    src: url("fonts/zulip-icons.eot?d6a0487bb617e47dd22f6b30a327cfd4?#iefix") format("embedded-opentype"),
+url("fonts/zulip-icons.woff2?d6a0487bb617e47dd22f6b30a327cfd4") format("woff2"),
+url("fonts/zulip-icons.woff?d6a0487bb617e47dd22f6b30a327cfd4") format("woff");
+    font-weight: normal;
+    font-style: normal;
+}
+
+i.zulip-icon {
+    font-family: 'zulip-icons' !important;
+    font-style: normal !important;
+    font-weight: normal !important;
+    font-variant: normal !important;
+    text-transform: none;
+    font-size: inherit;
+    line-height: 100%;
+
+    text-decoration: inherit;
+    text-rendering: auto;
+    display: inline-block;
+    speak: none;
+
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+.zulip-icon::before {
+    font-family: 'zulip-icons' !important;
+    font-style: normal;
+    font-weight: normal !important;
+    vertical-align: top;
+}
+
+.zulip-icon.bot::before {
+    content: "\f101";
+}
diff --git a/tools/generate-custom-icon-webfont b/tools/generate-custom-icon-webfont
new file mode 100755
index 0000000000..97de41906b
--- /dev/null
+++ b/tools/generate-custom-icon-webfont
@@ -0,0 +1,39 @@
+#!/usr/bin/env node
+
+const fs = require('fs');
+const webfontsGenerator = require('webfonts-generator');
+
+fs.readdir('./static/assets/icons', function (err, files) {
+    if (err) {
+        console.error(err);
+        process.exit(1);
+    }
+
+    // Filter out any non-SVG files and join by absolute path
+    const svg = files.filter(function (file) {
+        return file.slice(-4) === '.svg';
+    }).map(function (file) {
+        return './static/assets/icons/' + file;
+    });
+
+    // Generate webfonts
+    const options = {
+        files: svg,
+        dest: './static/icons/fonts',
+        fontName: 'zulip-icons',
+        cssDest: './static/icons/style.css',
+        cssFontsUrl: 'fonts/',
+        templateOptions: {
+            classPrefix: '',
+            baseSelector: '.zulip-icon',
+        },
+        cssTemplate: './static/icons/fonts/template.hbs',
+    };
+    webfontsGenerator(options, function (err) {
+        if (err) {
+            console.error(err);
+            process.exit(1);
+        }
+        console.log('SUCCESS! Webfonts generated in /static/icons/fonts.');
+    });
+});
diff --git a/tools/linter_lib/custom_check.py b/tools/linter_lib/custom_check.py
index e1c2b491f9..ad88def0a7 100644
--- a/tools/linter_lib/custom_check.py
+++ b/tools/linter_lib/custom_check.py
@@ -199,7 +199,8 @@ def build_custom_checkers(by_lang):
                          'frontend_tests/zjsunit',
                          'frontend_tests/casper_lib/common.js',
                          'frontend_tests/node_tests',
-                         'static/js/debug.js']),
+                         'static/js/debug.js',
+                         'tools/generate-custom-icon-webfont']),
          'description': 'console.log and similar should not be used in webapp'},
         {'pattern': '[.]text\(["\'][a-zA-Z]',
          'description': 'Strings passed to $().text should be wrapped in i18n.t() for internationalization'},
diff --git a/version.py b/version.py
index f8e20955ed..091730709e 100644
--- a/version.py
+++ b/version.py
@@ -1,2 +1,2 @@
 ZULIP_VERSION = "1.7.0+git"
-PROVISION_VERSION = '11.2'
+PROVISION_VERSION = '11.3'
diff --git a/zproject/settings.py b/zproject/settings.py
index 63b651dcdf..1a2666c63b 100644
--- a/zproject/settings.py
+++ b/zproject/settings.py
@@ -783,6 +783,7 @@ PIPELINE = {
                 'styles/portico-signin.css',
                 'styles/pygments.css',
                 'third/thirdparty-fonts.css',
+                'icons/style.css',
                 'styles/fonts.css',
             ),
             'output_filename': 'min/portico.css'
@@ -799,6 +800,7 @@ PIPELINE = {
                 'third/bootstrap-notify/css/bootstrap-notify.css',
                 'third/spectrum/spectrum.css',
                 'third/thirdparty-fonts.css',
+                'icons/style.css',
                 'styles/components.css',
                 'styles/app_components.css',
                 'styles/zulip.css',
@@ -826,6 +828,7 @@ PIPELINE = {
                 'third/bootstrap-notify/css/bootstrap-notify.css',
                 'third/spectrum/spectrum.css',
                 'third/thirdparty-fonts.css',
+                'icons/style.css',
                 'node_modules/katex/dist/katex.css',
                 'styles/components.css',
                 'styles/app_components.css',