diff --git a/R/facet.R b/R/facet.R
index 9b8fbcb5..d9747d4a 100644
--- a/R/facet.R
+++ b/R/facet.R
@@ -23,8 +23,8 @@ draw_facet_window = function(
     nfacets, nfacet_cols, nfacet_rows,
     # axes args
     axes, flip, frame.plot, oxaxis, oyaxis,
-    xlabs, xlim, xaxt, xaxs, xaxl,
-    ylabs, ylim, yaxt, yaxs, yaxl,
+    xlabs, xlim, xlim_user, xaxt, xaxs, xaxl,
+    ylabs, ylim, ylim_user, yaxt, yaxs, yaxl,
     asp, log,
     # other args (in approx. alphabetical + group ordering)
     dots,
@@ -293,8 +293,8 @@ draw_facet_window = function(
         # individual facet.
         xfree = split(c(x, xmin, xmax), facet)[[ii]]
         yfree = split(c(y, ymin, ymax), facet)[[ii]]
-        xlim = range(xfree, na.rm = TRUE)
-        ylim = range(yfree, na.rm = TRUE)
+        if (!xlim_user) xlim = range(xfree, na.rm = TRUE)
+        if (!ylim_user) ylim = range(yfree, na.rm = TRUE)
         xext = extendrange(xlim, f = 0.04)
         yext = extendrange(ylim, f = 0.04)
         # We'll save this in a special .fusr env var (list) that we'll re-use
@@ -310,14 +310,14 @@ draw_facet_window = function(
         par(usr = fusr[[ii]])
         # if plot frame is true then print axes per normal...
         if (type %in% c("barplot", "pointrange", "errorbar", "ribbon", "boxplot", "p", "violin") && !is.null(xlabs)) {
-          tinyAxis(xfree, side = xside, at = xlabs, labels = names(xlabs), type = xaxt)
+          tinyAxis(xfree, side = xside, at = xlabs, labels = names(xlabs), type = xaxt, labeller = xaxl)
         } else {
-          tinyAxis(xfree, side = xside, type = xaxt)
+          tinyAxis(xfree, side = xside, type = xaxt, labeller = xaxl)
         }
         if (isTRUE(flip) && type %in% c("barplot", "pointrange", "errorbar", "ribbon", "boxplot", "p", "violin") && !is.null(ylabs)) {
-          tinyAxis(yfree, side = yside, at = ylabs, labels = names(ylabs), type = yaxt)
+          tinyAxis(yfree, side = yside, at = ylabs, labels = names(ylabs), type = yaxt, labeller = yaxl)
         } else {
-          tinyAxis(yfree, side = yside, type = yaxt)
+          tinyAxis(yfree, side = yside, type = yaxt, labeller = yaxl)
         }
 
         # For fixed facets we can just reuse the same plot extent and axes limits
diff --git a/R/lim.R b/R/lim.R
index bab00f29..e5797f6c 100644
--- a/R/lim.R
+++ b/R/lim.R
@@ -1,13 +1,16 @@
 # calculate limits of each plot
 
 lim_args = function(datapoints, xlim, ylim, type) {
-
-  if (is.null(xlim))
+  
+  xlim_user = ylim_user = TRUE
+  if (is.null(xlim)) {
     xlim = range(c(datapoints[["x"]], datapoints[["xmin"]],
                    datapoints[["xmax"]]), finite = TRUE)
-  if (is.null(ylim))
+  }
+  if (is.null(ylim)) {
     ylim = range(c(datapoints[["y"]], datapoints[["ymin"]],
                    datapoints[["ymax"]]), finite = TRUE)
+  }
 
   if (identical(type, "boxplot")) {
     xlim = xlim + c(-0.5, 0.5)
diff --git a/R/tinyplot.R b/R/tinyplot.R
index d5aadd25..342cf239 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -747,7 +747,6 @@ tinyplot.default = function(
       if (is.null(ylab)) ylab = "Density"
     } else if (type == "function") {
       if (is.null(ylab)) ylab = "Frequency"
-    # } else if (type != "histogram") {
     } else if (!(type %in% c("histogram", "barplot"))) {
       y = x
       x = seq_along(x)
@@ -756,8 +755,12 @@ tinyplot.default = function(
   }
 
   if (is.null(xlab)) xlab = x_dep
-  # if (is.null(ylab)) ylab = y_dep
   if (is.null(ylab) && type != "histogram") ylab = y_dep
+  
+  # flag(s) indicating whether x/ylim was set by the user (needed later for
+  # special case where facets are free but still want to set x/ylim manually)
+  xlim_user = !is.null(xlim)
+  ylim_user = !is.null(ylim)
 
   # alias
   if (is.null(bg) && !is.null(fill)) bg = fill
@@ -1148,8 +1151,8 @@ tinyplot.default = function(
       # axes args
       axes = axes, flip = flip, frame.plot = frame.plot,
       oxaxis = oxaxis, oyaxis = oyaxis,
-      xlabs = xlabs, xlim = xlim, xaxt = xaxt, xaxs = xaxs, xaxl = xaxl,
-      ylabs = ylabs, ylim = ylim, yaxt = yaxt, yaxs = yaxs, yaxl = yaxl,
+      xlabs = xlabs, xlim = xlim, xlim_user = xlim_user, xaxt = xaxt, xaxs = xaxs, xaxl = xaxl,
+      ylabs = ylabs, ylim = ylim, ylim_user = ylim_user, yaxt = yaxt, yaxs = yaxs, yaxl = yaxl,
       asp = asp, log = log,
       # other args (in approx. alphabetical + group ordering)
       dots = dots,
@@ -1172,8 +1175,8 @@ tinyplot.default = function(
       nfacets = nfacets, nfacet_cols = nfacet_cols, nfacet_rows = nfacet_rows,
       axes = axes, flip = flip, frame.plot = frame.plot,
       oxaxis = oxaxis, oyaxis = oyaxis,
-      xlabs = xlabs, xlim = xlim, xaxt = xaxt, xaxs = xaxs, xaxl = xaxl,
-      ylabs = ylabs, ylim = ylim, yaxt = yaxt, yaxs = yaxs, yaxl = yaxl,
+      xlabs = xlabs, xlim = xlim, xlim_user = xlim_user, xaxt = xaxt, xaxs = xaxs, xaxl = xaxl,
+      ylabs = ylabs, ylim = ylim, ylim_user = ylim_user, yaxt = yaxt, yaxs = yaxs, yaxl = yaxl,
       asp = asp, log = log,
       dots = dots,
       draw = draw,
diff --git a/R/zzz.R b/R/zzz.R
index 0c5ae07e..f75af8fa 100644
--- a/R/zzz.R
+++ b/R/zzz.R
@@ -59,6 +59,7 @@
     "xaxt",
     "xlabs",
     "xlim",
+    "xlim_user",
     "xlvls",
     "xmax",
     "xmin",
@@ -68,6 +69,7 @@
     "yaxt",
     "ylabs",
     "ylim",
+    "ylim_user",
     "ymax",
     "ymin"
   ))
diff --git a/man/facet.Rd b/man/facet.Rd
index da461aea..e60aef07 100644
--- a/man/facet.Rd
+++ b/man/facet.Rd
@@ -29,11 +29,13 @@ draw_facet_window(
   oyaxis,
   xlabs,
   xlim,
+  xlim_user,
   xaxt,
   xaxs,
   xaxl,
   ylabs,
   ylim,
+  ylim_user,
   yaxt,
   yaxs,
   yaxl,
