diff --git a/scss/_functions.scss b/scss/_functions.scss
new file mode 100644
index 0000000000000000000000000000000000000000..870df42a7931bce308ea4d61964854200b80bc3e
--- /dev/null
+++ b/scss/_functions.scss
@@ -0,0 +1,39 @@
+@mixin _assert-ascending($map, $map-name) {
+  $prev-key: null;
+  $prev-num: null;
+  @each $key, $num in $map {
+    @if $prev-num == null {
+      // Do nothing
+    } @else if not comparable($prev-num, $num) {
+      @warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !";
+    } @else if $prev-num >= $num {
+      @warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !";
+    }
+    $prev-key: $key;
+    $prev-num: $num;
+  }
+}
+
+// Replace `$search` with `$replace` in `$string`
+// @author Hugo Giraudel
+// @param {String} $string - Initial string
+// @param {String} $search - Substring to replace
+// @param {String} $replace ('') - New value
+// @return {String} - Updated string
+@function str-replace($string, $search, $replace: "") {
+  $index: str-index($string, $search);
+
+  @if $index {
+    @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
+  }
+
+  @return $string;
+}
+
+@mixin _assert-starts-at-zero($map) {
+  $values: map-values($map);
+  $first-value: nth($values, 1);
+  @if $first-value != 0 {
+    @warn "First breakpoint in `$grid-breakpoints` must start at 0, but starts at #{$first-value}.";
+  }
+}
diff --git a/scss/_variables.scss b/scss/_variables.scss
index 5bd938c6b0235e2d16c4792dce6866b22a353778..92d5e11e0a2c84905a3d116a88d4e7599cde8310 100644
--- a/scss/_variables.scss
+++ b/scss/_variables.scss
@@ -6,7 +6,6 @@
 // Variables should follow the `$component-state-property-size` formula for
 // consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.
 
-
 // Table of Contents
 //
 // Colors
@@ -44,51 +43,6 @@
 // Close
 // Code
 
-@mixin _assert-ascending($map, $map-name) {
-  $prev-key: null;
-  $prev-num: null;
-  @each $key, $num in $map {
-    @if $prev-num == null {
-      // Do nothing
-    } @else if not comparable($prev-num, $num) {
-      @warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !";
-    } @else if $prev-num >= $num {
-      @warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !";
-    }
-    $prev-key: $key;
-    $prev-num: $num;
-  }
-}
-
-// Replace `$search` with `$replace` in `$string`
-// @author Hugo Giraudel
-// @param {String} $string - Initial string
-// @param {String} $search - Substring to replace
-// @param {String} $replace ('') - New value
-// @return {String} - Updated string
-@function str-replace($string, $search, $replace: "") {
-  $index: str-index($string, $search);
-
-  @if $index {
-    @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
-  }
-
-  @return $string;
-}
-
-@mixin _assert-starts-at-zero($map) {
-  $values: map-values($map);
-  $first-value: nth($values, 1);
-  @if $first-value != 0 {
-    @warn "First breakpoint in `$grid-breakpoints` must start at 0, but starts at #{$first-value}.";
-  }
-}
-
-
-// General variable structure
-//
-// Variable format should follow the `$component-modifier-state-property` order.
-
 
 // Colors
 //
diff --git a/scss/bootstrap-grid.scss b/scss/bootstrap-grid.scss
index 2ba68587759b904fb8c37452f3d8bf6a2643e6fa..722856c05cdbe837655dcc1b3fc2dcba4d935e69 100644
--- a/scss/bootstrap-grid.scss
+++ b/scss/bootstrap-grid.scss
@@ -23,6 +23,7 @@ html {
 }
 
 @import "custom";
+@import "functions";
 @import "variables";
 
 //
diff --git a/scss/bootstrap-reboot.scss b/scss/bootstrap-reboot.scss
index 5867f08ec98c33a19154e70fe076d8dd40f3efa1..5965022a99665a16d1e6fac92ebfc1df48da52ce 100644
--- a/scss/bootstrap-reboot.scss
+++ b/scss/bootstrap-reboot.scss
@@ -3,6 +3,7 @@
 // Includes only Normalize and our custom Reboot reset.
 
 @import "custom";
+@import "functions";
 @import "variables";
 @import "mixins";
 
diff --git a/scss/bootstrap.scss b/scss/bootstrap.scss
index f7577f5c793b6ddb5c2333a135d47cd1bb8f3752..239d062cf6bbf2b6e24411486736ea385cbfb666 100644
--- a/scss/bootstrap.scss
+++ b/scss/bootstrap.scss
@@ -5,14 +5,11 @@
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  */
 
-// Core variables and mixins
 @import "custom";
+@import "functions";
 @import "variables";
 @import "mixins";
-
 @import "print";
-
-// Core CSS
 @import "reboot";
 @import "type";
 @import "images";
@@ -21,8 +18,6 @@
 @import "tables";
 @import "forms";
 @import "buttons";
-
-// Components
 @import "transitions";
 @import "dropdown";
 @import "button-group";
@@ -41,12 +36,8 @@
 @import "list-group";
 @import "responsive-embed";
 @import "close";
-
-// Components w/ JavaScript
 @import "modal";
 @import "tooltip";
 @import "popover";
 @import "carousel";
-
-// Utility classes
 @import "utilities";