diff --git a/fontawesome.module b/fontawesome.module
index 06e0c1d..8ce9e08 100644
--- a/fontawesome.module
+++ b/fontawesome.module
@@ -48,6 +48,7 @@ function fontawesome_libraries_info() {
       ),
     ),
   );
+
   return $libraries;
 }
 
@@ -69,7 +70,8 @@ function fontawesome_page_attachments(array &$page) {
               . 'fontawesome was download & extracted at /libraries/fontawesome directory.'
               . 'Please check README.txt for more details.'),
               'warning');
-    }else{
+    }
+    else {
       $page['#attached']['library'][] = 'fontawesome/fontawesome';
     }
   }
@@ -151,8 +153,6 @@ function fontawesome_preprocess_icon_sprite(&$variables) {
 
 /**
  * Implements hook_icon_bundles().
- *
- * @todo Extract icons from CSS or JSON file (currently not possible).
  */
 function fontawesome_icon_bundles() {
   $bundles[FONTAWESOME_LIBRARY] = array(
@@ -162,556 +162,45 @@ function fontawesome_icon_bundles() {
     'settings' => array(
       'tag' => 'i',
     ),
-    'icons' => array(
-      'adjust' => 'adjust',
-      'adn' => 'adn',
-      'align-center' => 'align-center',
-      'align-justify' => 'align-justify',
-      'align-left' => 'align-left',
-      'align-right' => 'align-right',
-      'ambulance' => 'ambulance',
-      'anchor' => 'anchor',
-      'android' => 'android',
-      'angellist' => 'angellist',
-      'angle-double-down' => 'angle-double-down',
-      'angle-double-left' => 'angle-double-left',
-      'angle-double-right' => 'angle-double-right',
-      'angle-double-up' => 'angle-double-up',
-      'angle-down' => 'angle-down',
-      'angle-left' => 'angle-left',
-      'angle-right' => 'angle-right',
-      'angle-up' => 'angle-up',
-      'apple' => 'apple',
-      'archive' => 'archive',
-      'area-chart' => 'area-chart',
-      'arrow-circle-down' => 'arrow-circle-down',
-      'arrow-circle-left' => 'arrow-circle-left',
-      'arrow-circle-o-down' => 'arrow-circle-o-down',
-      'arrow-circle-o-left' => 'arrow-circle-o-left',
-      'arrow-circle-o-right' => 'arrow-circle-o-right',
-      'arrow-circle-o-up' => 'arrow-circle-o-up',
-      'arrow-circle-right' => 'arrow-circle-right',
-      'arrow-circle-up' => 'arrow-circle-up',
-      'arrow-down' => 'arrow-down',
-      'arrow-left' => 'arrow-left',
-      'arrow-right' => 'arrow-right',
-      'arrow-up' => 'arrow-up',
-      'arrows-alt' => 'arrows-alt',
-      'arrows-h' => 'arrows-h',
-      'arrows-v' => 'arrows-v',
-      'arrows' => 'arrows',
-      'asterisk' => 'asterisk',
-      'at' => 'at',
-      'automobile' => 'car',
-      'backward' => 'backward',
-      'ban' => 'ban',
-      'bank' => 'university',
-      'bar-chart-o' => 'bar-chart',
-      'bar-chart' => 'bar-chart',
-      'barcode' => 'barcode',
-      'bars' => 'bars',
-      'beer' => 'beer',
-      'behance-square' => 'behance-square',
-      'behance' => 'behance',
-      'bell-o' => 'bell-o',
-      'bell-slash-o' => 'bell-slash-o',
-      'bell-slash' => 'bell-slash',
-      'bell' => 'bell',
-      'bicycle' => 'bicycle',
-      'binoculars' => 'binoculars',
-      'birthday-cake' => 'birthday-cake',
-      'bitbucket-square' => 'bitbucket-square',
-      'bitbucket' => 'bitbucket',
-      'bitcoin' => 'btc',
-      'bold' => 'bold',
-      'bolt' => 'bolt',
-      'bomb' => 'bomb',
-      'book' => 'book',
-      'bookmark-o' => 'bookmark-o',
-      'bookmark' => 'bookmark',
-      'briefcase' => 'briefcase',
-      'btc' => 'btc',
-      'bug' => 'bug',
-      'building-o' => 'building-o',
-      'building' => 'building',
-      'bullhorn' => 'bullhorn',
-      'bullseye' => 'bullseye',
-      'bus' => 'bus',
-      'cab' => 'taxi',
-      'calculator' => 'calculator',
-      'calendar-o' => 'calendar-o',
-      'calendar' => 'calendar',
-      'camera-retro' => 'camera-retro',
-      'camera' => 'camera',
-      'car' => 'car',
-      'caret-down' => 'caret-down',
-      'caret-left' => 'caret-left',
-      'caret-right' => 'caret-right',
-      'caret-square-o-down' => 'caret-square-o-down',
-      'caret-square-o-left' => 'caret-square-o-left',
-      'caret-square-o-right' => 'caret-square-o-right',
-      'caret-square-o-up' => 'caret-square-o-up',
-      'caret-up' => 'caret-up',
-      'cc-amex' => 'cc-amex',
-      'cc-discover' => 'cc-discover',
-      'cc-mastercard' => 'cc-mastercard',
-      'cc-paypal' => 'cc-paypal',
-      'cc-stripe' => 'cc-stripe',
-      'cc-visa' => 'cc-visa',
-      'cc' => 'cc',
-      'certificate' => 'certificate',
-      'chain-broken' => 'chain-broken',
-      'chain' => 'link',
-      'check-circle-o' => 'check-circle-o',
-      'check-circle' => 'check-circle',
-      'check-square-o' => 'check-square-o',
-      'check-square' => 'check-square',
-      'check' => 'check',
-      'chevron-circle-down' => 'chevron-circle-down',
-      'chevron-circle-left' => 'chevron-circle-left',
-      'chevron-circle-right' => 'chevron-circle-right',
-      'chevron-circle-up' => 'chevron-circle-up',
-      'chevron-down' => 'chevron-down',
-      'chevron-left' => 'chevron-left',
-      'chevron-right' => 'chevron-right',
-      'chevron-up' => 'chevron-up',
-      'child' => 'child',
-      'circle-o-notch' => 'circle-o-notch',
-      'circle-o' => 'circle-o',
-      'circle-thin' => 'circle-thin',
-      'circle' => 'circle',
-      'clipboard' => 'clipboard',
-      'clock-o' => 'clock-o',
-      'close' => 'times',
-      'cloud-download' => 'cloud-download',
-      'cloud-upload' => 'cloud-upload',
-      'cloud' => 'cloud',
-      'cny' => 'jpy',
-      'code-fork' => 'code-fork',
-      'code' => 'code',
-      'codepen' => 'codepen',
-      'coffee' => 'coffee',
-      'cog' => 'cog',
-      'cogs' => 'cogs',
-      'columns' => 'columns',
-      'comment-o' => 'comment-o',
-      'comment' => 'comment',
-      'comments-o' => 'comments-o',
-      'comments' => 'comments',
-      'compass' => 'compass',
-      'compress' => 'compress',
-      'copy' => 'files-o',
-      'copyright' => 'copyright',
-      'credit-card' => 'credit-card',
-      'crop' => 'crop',
-      'crosshairs' => 'crosshairs',
-      'css3' => 'css3',
-      'cube' => 'cube',
-      'cubes' => 'cubes',
-      'cut' => 'scissors',
-      'cutlery' => 'cutlery',
-      'dashboard' => 'tachometer',
-      'database' => 'database',
-      'dedent' => 'outdent',
-      'delicious' => 'delicious',
-      'desktop' => 'desktop',
-      'deviantart' => 'deviantart',
-      'digg' => 'digg',
-      'dollar' => 'usd',
-      'dot-circle-o' => 'dot-circle-o',
-      'download' => 'download',
-      'dribbble' => 'dribbble',
-      'dropbox' => 'dropbox',
-      'drupal' => 'drupal',
-      'edit' => 'pencil-square-o',
-      'eject' => 'eject',
-      'ellipsis-h' => 'ellipsis-h',
-      'ellipsis-v' => 'ellipsis-v',
-      'empire' => 'empire',
-      'envelope-o' => 'envelope-o',
-      'envelope-square' => 'envelope-square',
-      'envelope' => 'envelope',
-      'eraser' => 'eraser',
-      'eur' => 'eur',
-      'euro' => 'eur',
-      'exchange' => 'exchange',
-      'exclamation-circle' => 'exclamation-circle',
-      'exclamation-triangle' => 'exclamation-triangle',
-      'exclamation' => 'exclamation',
-      'expand' => 'expand',
-      'external-link-square' => 'external-link-square',
-      'external-link' => 'external-link',
-      'eye-slash' => 'eye-slash',
-      'eye' => 'eye',
-      'eyedropper' => 'eyedropper',
-      'facebook-square' => 'facebook-square',
-      'facebook' => 'facebook',
-      'fast-backward' => 'fast-backward',
-      'fast-forward' => 'fast-forward',
-      'fax' => 'fax',
-      'female' => 'female',
-      'fighter-jet' => 'fighter-jet',
-      'file-archive-o' => 'file-archive-o',
-      'file-audio-o' => 'file-audio-o',
-      'file-code-o' => 'file-code-o',
-      'file-excel-o' => 'file-excel-o',
-      'file-image-o' => 'file-image-o',
-      'file-movie-o' => 'file-video-o',
-      'file-o' => 'file-o',
-      'file-pdf-o' => 'file-pdf-o',
-      'file-photo-o' => 'file-image-o',
-      'file-picture-o' => 'file-image-o',
-      'file-powerpoint-o' => 'file-powerpoint-o',
-      'file-sound-o' => 'file-audio-o',
-      'file-text-o' => 'file-text-o',
-      'file-text' => 'file-text',
-      'file-video-o' => 'file-video-o',
-      'file-word-o' => 'file-word-o',
-      'file-zip-o' => 'file-archive-o',
-      'file' => 'file',
-      'files-o' => 'files-o',
-      'film' => 'film',
-      'filter' => 'filter',
-      'fire-extinguisher' => 'fire-extinguisher',
-      'fire' => 'fire',
-      'flag-checkered' => 'flag-checkered',
-      'flag-o' => 'flag-o',
-      'flag' => 'flag',
-      'flash' => 'bolt',
-      'flask' => 'flask',
-      'flickr' => 'flickr',
-      'floppy-o' => 'floppy-o',
-      'folder-o' => 'folder-o',
-      'folder-open-o' => 'folder-open-o',
-      'folder-open' => 'folder-open',
-      'folder' => 'folder',
-      'font' => 'font',
-      'forward' => 'forward',
-      'foursquare' => 'foursquare',
-      'frown-o' => 'frown-o',
-      'futbol-o' => 'futbol-o',
-      'gamepad' => 'gamepad',
-      'gavel' => 'gavel',
-      'gbp' => 'gbp',
-      'ge' => 'empire',
-      'gear' => 'cog',
-      'gears' => 'cogs',
-      'gift' => 'gift',
-      'git-square' => 'git-square',
-      'git' => 'git',
-      'github-alt' => 'github-alt',
-      'github-square' => 'github-square',
-      'github' => 'github',
-      'gittip' => 'gittip',
-      'globe' => 'globe',
-      'google-plus-square' => 'google-plus-square',
-      'google-plus' => 'google-plus',
-      'google-wallet' => 'google-wallet',
-      'google' => 'google',
-      'graduation-cap' => 'graduation-cap',
-      'group' => 'users',
-      'h-square' => 'h-square',
-      'hacker-news' => 'hacker-news',
-      'hand-o-down' => 'hand-o-down',
-      'hand-o-left' => 'hand-o-left',
-      'hand-o-right' => 'hand-o-right',
-      'hand-o-up' => 'hand-o-up',
-      'hdd-o' => 'hdd-o',
-      'header' => 'header',
-      'headphones' => 'headphones',
-      'heart-o' => 'heart-o',
-      'heart' => 'heart',
-      'history' => 'history',
-      'home' => 'home',
-      'hospital-o' => 'hospital-o',
-      'html5' => 'html5',
-      'ils' => 'ils',
-      'image' => 'picture-o',
-      'inbox' => 'inbox',
-      'indent' => 'indent',
-      'info-circle' => 'info-circle',
-      'info' => 'info',
-      'inr' => 'inr',
-      'instagram' => 'instagram',
-      'institution' => 'university',
-      'ioxhost' => 'ioxhost',
-      'italic' => 'italic',
-      'joomla' => 'joomla',
-      'jpy' => 'jpy',
-      'jsfiddle' => 'jsfiddle',
-      'key' => 'key',
-      'keyboard-o' => 'keyboard-o',
-      'krw' => 'krw',
-      'language' => 'language',
-      'laptop' => 'laptop',
-      'lastfm-square' => 'lastfm-square',
-      'lastfm' => 'lastfm',
-      'leaf' => 'leaf',
-      'legal' => 'gavel',
-      'lemon-o' => 'lemon-o',
-      'level-down' => 'level-down',
-      'level-up' => 'level-up',
-      'life-bouy' => 'life-ring',
-      'life-buoy' => 'life-ring',
-      'life-ring' => 'life-ring',
-      'life-saver' => 'life-ring',
-      'lightbulb-o' => 'lightbulb-o',
-      'line-chart' => 'line-chart',
-      'link' => 'link',
-      'linkedin-square' => 'linkedin-square',
-      'linkedin' => 'linkedin',
-      'linux' => 'linux',
-      'list-alt' => 'list-alt',
-      'list-ol' => 'list-ol',
-      'list-ul' => 'list-ul',
-      'list' => 'list',
-      'location-arrow' => 'location-arrow',
-      'lock' => 'lock',
-      'long-arrow-down' => 'long-arrow-down',
-      'long-arrow-left' => 'long-arrow-left',
-      'long-arrow-right' => 'long-arrow-right',
-      'long-arrow-up' => 'long-arrow-up',
-      'magic' => 'magic',
-      'magnet' => 'magnet',
-      'mail-forward' => 'share',
-      'mail-reply-all' => 'reply-all',
-      'mail-reply' => 'reply',
-      'male' => 'male',
-      'map-marker' => 'map-marker',
-      'maxcdn' => 'maxcdn',
-      'meanpath' => 'meanpath',
-      'medkit' => 'medkit',
-      'meh-o' => 'meh-o',
-      'microphone-slash' => 'microphone-slash',
-      'microphone' => 'microphone',
-      'minus-circle' => 'minus-circle',
-      'minus-square-o' => 'minus-square-o',
-      'minus-square' => 'minus-square',
-      'minus' => 'minus',
-      'mobile-phone' => 'mobile',
-      'mobile' => 'mobile',
-      'money' => 'money',
-      'moon-o' => 'moon-o',
-      'mortar-board' => 'graduation-cap',
-      'music' => 'music',
-      'navicon' => 'bars',
-      'newspaper-o' => 'newspaper-o',
-      'openid' => 'openid',
-      'outdent' => 'outdent',
-      'pagelines' => 'pagelines',
-      'paint-brush' => 'paint-brush',
-      'paper-plane-o' => 'paper-plane-o',
-      'paper-plane' => 'paper-plane',
-      'paperclip' => 'paperclip',
-      'paragraph' => 'paragraph',
-      'paste' => 'clipboard',
-      'pause' => 'pause',
-      'paw' => 'paw',
-      'paypal' => 'paypal',
-      'pencil-square-o' => 'pencil-square-o',
-      'pencil-square' => 'pencil-square',
-      'pencil' => 'pencil',
-      'phone-square' => 'phone-square',
-      'phone' => 'phone',
-      'photo' => 'picture-o',
-      'picture-o' => 'picture-o',
-      'pie-chart' => 'pie-chart',
-      'pied-piper-alt' => 'pied-piper-alt',
-      'pied-piper' => 'pied-piper',
-      'pinterest-square' => 'pinterest-square',
-      'pinterest' => 'pinterest',
-      'plane' => 'plane',
-      'play-circle-o' => 'play-circle-o',
-      'play-circle' => 'play-circle',
-      'play' => 'play',
-      'plug' => 'plug',
-      'plus-circle' => 'plus-circle',
-      'plus-square-o' => 'plus-square-o',
-      'plus-square' => 'plus-square',
-      'plus' => 'plus',
-      'power-off' => 'power-off',
-      'print' => 'print',
-      'puzzle-piece' => 'puzzle-piece',
-      'qq' => 'qq',
-      'qrcode' => 'qrcode',
-      'question-circle' => 'question-circle',
-      'question' => 'question',
-      'quote-left' => 'quote-left',
-      'quote-right' => 'quote-right',
-      'ra' => 'rebel',
-      'random' => 'random',
-      'rebel' => 'rebel',
-      'recycle' => 'recycle',
-      'reddit-square' => 'reddit-square',
-      'reddit' => 'reddit',
-      'refresh' => 'refresh',
-      'remove' => 'times',
-      'renren' => 'renren',
-      'reorder' => 'bars',
-      'repeat' => 'repeat',
-      'reply-all' => 'reply-all',
-      'reply' => 'reply',
-      'retweet' => 'retweet',
-      'rmb' => 'jpy',
-      'road' => 'road',
-      'rocket' => 'rocket',
-      'rotate-left' => 'undo',
-      'rotate' => 'repeat',
-      'rouble' => 'rub',
-      'rss-square' => 'rss-square',
-      'rss' => 'rss',
-      'rub' => 'rub',
-      'ruble' => 'rub',
-      'rupee' => 'inr',
-      'save' => 'floppy-o',
-      'scissors' => 'scissors',
-      'search-minus' => 'search-minus',
-      'search-plus' => 'search-plus',
-      'search' => 'search',
-      'send-o' => 'paper-plane-o',
-      'send' => 'paper-plane',
-      'share-alt-square' => 'share-alt-square',
-      'share-alt' => 'share-alt',
-      'share-square-o' => 'share-square-o',
-      'share-square' => 'share-square',
-      'share' => 'share',
-      'shekel' =>  'ils',
-      'sheqel' => 'ils',
-      'shield' => 'shield',
-      'shopping-cart' => 'shopping-cart',
-      'sign-in' => 'sign-in',
-      'sign-out' => 'sign-out',
-      'signal' => 'signal',
-      'sitemap' => 'sitemap',
-      'skype' => 'skype',
-      'slack' => 'slack',
-      'sliders' => 'sliders',
-      'slideshare' => 'slideshare',
-      'smile-o' => 'smile-o',
-      'soccer-ball-o' => 'futbol-o',
-      'sort-alpha-asc' => 'sort-alpha-asc',
-      'sort-alpha-desc' => 'sort-alpha-desc',
-      'sort-amount-asc' => 'sort-amount-asc',
-      'sort-amount-desc' => 'sort-amount-desc',
-      'sort-asc' => 'sort-asc',
-      'sort-desc' => 'sort-desc',
-      'sort-down' => 'sort-desc',
-      'sort-numeric-asc' => 'sort-numeric-asc',
-      'sort-numeric-desc' => 'sort-numeric-desc',
-      'sort-up' => 'sort-asc',
-      'sort' => 'sort',
-      'soundcloud' => 'soundcloud',
-      'space-shuttle' => 'space-shuttle',
-      'spinner' => 'spinner',
-      'spoon' => 'spoon',
-      'spotify' => 'spotify',
-      'square-o' => 'square-o',
-      'square' => 'square',
-      'stack-exchange' => 'stack-exchange',
-      'stack-overflow' => 'stack-overflow',
-      'star-half-empty' => 'star-half-o',
-      'star-half-full' => 'star-half-o',
-      'star-half-o' => 'star-half-o',
-      'star-half' => 'star-half',
-      'star-o' => 'star-o',
-      'star' => 'star',
-      'steam-square' => 'steam-square',
-      'steam' => 'steam',
-      'step-backward' => 'step-backward',
-      'step-forward' => 'step-forward',
-      'stethoscope' => 'stethoscope',
-      'stop' => 'stop',
-      'strikethrough' => 'strikethrough',
-      'stumbleupon-circle' => 'stumbleupon-circle',
-      'stumbleupon' => 'stumbleupon',
-      'subscript' => 'subscript',
-      'suitcase' => 'suitcase',
-      'sun-o' => 'sun-o',
-      'superscript' => 'superscript',
-      'support' => 'life-ring',
-      'table' => 'table',
-      'tablet' => 'tablet',
-      'tachometer' => 'tachometer',
-      'tag' => 'tag',
-      'tags' => 'tags',
-      'tasks' => 'tasks',
-      'taxi' => 'taxi',
-      'tencent-weibo' => 'tencent-weibo',
-      'terminal' => 'terminal',
-      'text-height' => 'text-height',
-      'text-width' => 'text-width',
-      'th-large' => 'th-large',
-      'th-list' => 'th-list',
-      'th' => 'th',
-      'thumb-tack' => 'thumb-tack',
-      'thumbs-down' => 'thumbs-down',
-      'thumbs-o-down' => 'thumbs-o-down',
-      'thumbs-o-up' => 'thumbs-o-up',
-      'thumbs-up' => 'thumbs-up',
-      'ticket' => 'ticket',
-      'times-circle-o' => 'times-circle-o',
-      'times-circle' => 'times-circle',
-      'times' => 'times',
-      'tint' => 'tint',
-      'toggle-down' => 'caret-square-o-down',
-      'toggle-left' => 'caret-square-o-left',
-      'toggle-off' => 'toggle-off',
-      'toggle-on' => 'toggle-on',
-      'toggle-right' => 'caret-square-o-right',
-      'toggle-up' => 'caret-square-o-up',
-      'trash-o' => 'trash-o',
-      'trash' => 'trash',
-      'tree' => 'tree',
-      'trello' => 'trello',
-      'trophy' => 'trophy',
-      'truck' => 'truck',
-      'try' => 'try',
-      'tty' => 'tty',
-      'tumblr-square' => 'tumblr-square',
-      'tumblr' => 'tumblr',
-      'turkish-lira' => 'try',
-      'twitch' => 'twitch',
-      'twitter-square' => 'twitter-square',
-      'twitter' => 'twitter',
-      'umbrella' => 'umbrella',
-      'underline' => 'underline',
-      'undo' => 'undo',
-      'university' => 'university',
-      'unlink' => 'chain-broken',
-      'unlock-alt' => 'unlock-alt',
-      'unlock' => 'unlock',
-      'unsorted' => 'sort',
-      'upload' => 'upload',
-      'usd' => 'usd',
-      'user-md' => 'user-md',
-      'user' => 'user',
-      'users' => 'users',
-      'video-camera' => 'video-camera',
-      'vimeo-square' => 'vimeo-square',
-      'vine' => 'vine',
-      'vk' => 'vk',
-      'volume-down' => 'volume-down',
-      'volume-off' => 'volume-off',
-      'volume-up' => 'volume-up',
-      'warning' => 'exclamation-triangle',
-      'wechat' => 'weixin',
-      'weibo' => 'weibo',
-      'weixin' => 'weixin',
-      'wheelchair' => 'wheelchair',
-      'wifi' => 'wifi',
-      'windows' => 'windows',
-      'won' => 'krw',
-      'wordpress' => 'wordpress',
-      'wrench' => 'wrench',
-      'xing-square' => 'xing-square',
-      'xing' => 'xing',
-      'yahoo' => 'yahoo',
-      'yelp' => 'yelp',
-      'yen' => 'jpy',
-      'youtube-play' => 'youtube-play',
-      'youtube-square' => 'youtube-square',
-      'youtube' => 'youtube',
-    ),
+    'icons' => 'icons' => fontawesome_extract_icons(),
   );
+
   return $bundles;
 }
+
+/**
+ * Extracts all icons from the CSS file.
+ *
+ * @return array
+ */
+function fontawesome_extract_icons() {
+  // If CDN is enabled, get CSS content from the CDN URL
+  if (\Drupal::config('fontawesome.settings')->get('fontawesome_use_cdn')) {
+    $url = FONTAWESOME_CDN_URL;
+
+    // The URL needs to have a schema to work with drupal_http_request
+    if (strpos($url, '//') === 0) {
+      $url = 'http:' . $url;
+    }
+
+    $response = \Drupal::httpClient()->get($url, array('headers' => array('Accept' => 'text/plain')));
+    $content = (string) $response->getBody();
+  }
+  // Otherwise get CSS content from the local library
+  else {
+    $library = libraries_load(FONTAWESOME_LIBRARY);
+    $filepath = DRUPAL_ROOT . '/' . $library['library path'] . '/css/font-awesome.css';
+
+    $content = file_exists($filepath) ? file_get_contents($filepath) : '';
+  }
+
+  // Parse the CSS content
+  if (preg_match_all('@\.fa-(.*?):before@m', $content, $matches)) {
+    $icons = $matches[1];
+    asort($icons);
+
+    return drupal_map_assoc($icons);
+  }
+
+  return array();
+}
