diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/model.R b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/model.R
index 3245db800939dc6f30c42f3e67bee168579ac8ae..37640f855ba9e0ec96d6831e6d6abb188f944f2c 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/model.R
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/model.R
@@ -5,7 +5,7 @@
 #
 # Copyright (c) 1995, 1996  Robert Gentleman and Ross Ihaka
 # Copyright (c) 1997-2013,  The R Core Team
-# Copyright (c) 2016, Oracle and/or its affiliates
+# Copyright (c) 2016, 2017 Oracle and/or its affiliates
 #
 # All rights reserved.
 #
@@ -166,7 +166,7 @@ ExtractVars <- function (formula, checkonly=FALSE) {
         if (identical(op, quote(`~`))) { # tilde
             if (response) {
                 error("invalid model formula")
-            } else if (is.null(formula[[3]])) {
+            } else if (length(formula) < 3 || is.null(formula[[3]])) {
                 response <<- FALSE
                 ExtractVars(formula[[2]], FALSE)
             } else {
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/RecordGraphics.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/RecordGraphics.java
index b0be4bf5342b864edfc78816e3218bb41c1494fb..5182327ab41aeac25c16cefd9204729f11e4dc36 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/RecordGraphics.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/RecordGraphics.java
@@ -22,6 +22,7 @@
  */
 package com.oracle.truffle.r.nodes.builtin.base;
 
+import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.instanceOf;
 import static com.oracle.truffle.r.runtime.builtins.RBehavior.COMPLEX;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL;
 
@@ -53,6 +54,13 @@ public abstract class RecordGraphics extends RBuiltinNode {
     @Child private SetVisibilityNode visibility = SetVisibilityNode.create();
     @Child private RList2EnvNode list2EnvNode = new RList2EnvNode();
 
+    static {
+        Casts casts = new Casts(RecordGraphics.class);
+        casts.arg("expr").mustBe(instanceOf(RLanguage.class).or(instanceOf(RExpression.class)));
+        casts.arg("list").mustBe(instanceOf(RList.class));
+        casts.arg("env").mustBe(instanceOf(REnvironment.class));
+    }
+
     public static RecordGraphics create() {
         return RecordGraphicsNodeGen.create();
     }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/CallAndExternalFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/CallAndExternalFunctions.java
index c8fc0b6df1d973f36b7631a6d93172e63cfd2c2c..40b188aed727ee7cd36735edc3f1510c02b97442 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/CallAndExternalFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/CallAndExternalFunctions.java
@@ -911,6 +911,10 @@ public class CallAndExternalFunctions {
 
         private final BranchProfile errorProfile = BranchProfile.create();
 
+        static {
+            Casts.noCasts(DotExternalGraphics.class);
+        }
+
         @Override
         @TruffleBoundary
         protected RExternalBuiltinNode lookupBuiltin(RList f) {
@@ -970,6 +974,10 @@ public class CallAndExternalFunctions {
 
         private final BranchProfile errorProfile = BranchProfile.create();
 
+        static {
+            Casts.noCasts(DotCallGraphics.class);
+        }
+
         @Override
         public Object[] getDefaultParameterValues() {
             return new Object[]{RMissing.instance, RArgsValuesAndNames.EMPTY, RMissing.instance};
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
index b9140ddfa37645ceea1f58eb135f6b32508dd29f..6a8a449ed938b77889963326a092a789242a536f 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
@@ -132606,6 +132606,20 @@ list(cyl, hp, mpg, disp, drat, wt, qsec, vs, am, gear, carb)
 9  8  9
 10 9 10
 
+##com.oracle.truffle.r.test.library.stats.TestFormulae.testModelFrame#
+#{y<-0:9;z<-1:10;k<-2:11;w<-3:12;m<-4:13;u<-5:14;v<-6:15;; model.frame(terms.formula(~k+y+z)) }
+    k y  z
+1   2 0  1
+2   3 1  2
+3   4 2  3
+4   5 3  4
+5   6 4  5
+6   7 5  6
+7   8 6  7
+8   9 7  8
+9  10 8  9
+10 11 9 10
+
 ##com.oracle.truffle.r.test.library.stats.TestFormulae.testModelFrame#
 #{y<-0:9;z<-1:10;k<-2:11;w<-3:12;m<-4:13;u<-5:14;v<-6:15;k <- factor(rep(c('m', 'f'), 5));z <- factor(c(rep(c('a', 'b', 'c'), 3), 'c')); ; model.frame(terms.formula(u~z*k+w*m)) }
     u z k  w  m
@@ -132816,6 +132830,20 @@ list(cyl, hp, mpg, disp, drat, wt, qsec, vs, am, gear, carb)
 9  8 c
 10 9 c
 
+##com.oracle.truffle.r.test.library.stats.TestFormulae.testModelFrame#
+#{y<-0:9;z<-1:10;k<-2:11;w<-3:12;m<-4:13;u<-5:14;v<-6:15;k <- factor(rep(c('m', 'f'), 5));z <- factor(c(rep(c('a', 'b', 'c'), 3), 'c')); ; model.frame(terms.formula(~k+y+z)) }
+   k y z
+1  m 0 a
+2  f 1 b
+3  m 2 c
+4  f 3 a
+5  m 4 b
+6  f 5 c
+7  m 6 a
+8  f 7 b
+9  m 8 c
+10 f 9 c
+
 ##com.oracle.truffle.r.test.library.stats.TestFormulae.testModelMatrix#
 #{y<-0:9;z<-1:10;k<-2:11;w<-3:12;m<-4:13;u<-5:14;v<-6:15;; model.matrix(model.frame(terms.formula(u~z*k+w*m))) }
    (Intercept)  z  k  w  m z:k w:m
@@ -133056,6 +133084,22 @@ attr(,"assign")
 attr(,"assign")
 [1] 0 1
 
+##com.oracle.truffle.r.test.library.stats.TestFormulae.testModelMatrix#
+#{y<-0:9;z<-1:10;k<-2:11;w<-3:12;m<-4:13;u<-5:14;v<-6:15;; model.matrix(model.frame(terms.formula(~k+y+z))) }
+   (Intercept)  k y  z
+1            1  2 0  1
+2            1  3 1  2
+3            1  4 2  3
+4            1  5 3  4
+5            1  6 4  5
+6            1  7 5  6
+7            1  8 6  7
+8            1  9 7  8
+9            1 10 8  9
+10           1 11 9 10
+attr(,"assign")
+[1] 0 1 2 3
+
 ##com.oracle.truffle.r.test.library.stats.TestFormulae.testModelMatrix#
 #{y<-0:9;z<-1:10;k<-2:11;w<-3:12;m<-4:13;u<-5:14;v<-6:15;k <- factor(rep(c('m', 'f'), 5));z <- factor(c(rep(c('a', 'b', 'c'), 3), 'c')); ; model.matrix(model.frame(terms.formula(u~z*k+w*m))) }
    (Intercept) zb zc km  w  m zb:km zc:km w:m
@@ -133370,6 +133414,29 @@ attr(,"contrasts")$z
 [1] "contr.treatment"
 
 
+##com.oracle.truffle.r.test.library.stats.TestFormulae.testModelMatrix#
+#{y<-0:9;z<-1:10;k<-2:11;w<-3:12;m<-4:13;u<-5:14;v<-6:15;k <- factor(rep(c('m', 'f'), 5));z <- factor(c(rep(c('a', 'b', 'c'), 3), 'c')); ; model.matrix(model.frame(terms.formula(~k+y+z))) }
+   (Intercept) km y zb zc
+1            1  1 0  0  0
+2            1  0 1  1  0
+3            1  1 2  0  1
+4            1  0 3  0  0
+5            1  1 4  1  0
+6            1  0 5  0  1
+7            1  1 6  0  0
+8            1  0 7  1  0
+9            1  1 8  0  1
+10           1  0 9  0  1
+attr(,"assign")
+[1] 0 1 2 3 3
+attr(,"contrasts")
+attr(,"contrasts")$k
+[1] "contr.treatment"
+
+attr(,"contrasts")$z
+[1] "contr.treatment"
+
+
 ##com.oracle.truffle.r.test.library.stats.TestFormulae.testSpecialsTermsform#
 #f <- terms.formula(y~myfun(z)+x, c('myfun')); attrs <- attributes(f); envIdx <- which(names(attrs)=='.Environment'); print(attrs[envIdx]); attrs[sort(names(attrs[-envIdx]))]
 $.Environment
@@ -133866,6 +133933,36 @@ $variables
 list(y, z)
 
 
+##com.oracle.truffle.r.test.library.stats.TestFormulae.testTermsform#
+#f <- terms.formula(~k+y+z); attrs <- attributes(f); envIdx <- which(names(attrs)=='.Environment'); print(attrs[envIdx]); attrs[sort(names(attrs[-envIdx]))]
+$.Environment
+<environment: R_GlobalEnv>
+
+$class
+[1] "terms"   "formula"
+
+$factors
+  k y z
+k 1 0 0
+y 0 1 0
+z 0 0 1
+
+$intercept
+[1] 1
+
+$order
+[1] 1 1 1
+
+$response
+[1] 0
+
+$term.labels
+[1] "k" "y" "z"
+
+$variables
+list(k, y, z)
+
+
 ##com.oracle.truffle.r.test.library.stats.TestRandGenerationFunctions.testFunctions1#Output.IgnoreWhitespace#
 #set.seed(10); rsignrank(12, c(NA, NaN, 1/0, -1/0, -1, 1, 0.3, -0.6, 0.0653, 0.000123, 32e-80, 10))
  [1] NA NA  0 NA NA  1  0 NA  0  0  0 21
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestFormulae.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestFormulae.java
index deb60b64d75a815886b0db2f360e6c4c3489d4c1..c2d7be4e0b73e889737f4a424536c3a14a7ba03e 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestFormulae.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestFormulae.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -59,7 +59,8 @@ public class TestFormulae extends TestBase {
     private static final String[] FORMULAE = new String[]{
                     "y~z", "y~1+z", "y~0+z", "y~-1+z", "y~z*k", "y~z*k+w*m", "u~z*k+w*m",
                     "y~z:k", "y~z^2", "y~(z+k)^2", "y~z*((m+w)^3)",
-                    "y~(z+k)*(w+u)", "y~w%in%v", "y~w/k", "y~(1 + w/k)"
+                    "y~(z+k)*(w+u)", "y~w%in%v", "y~w/k", "y~(1 + w/k)",
+                    "~k+y+z"
     };
 
     /**
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/modelTests.R b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/modelTests.R
index d4458943fbd3bca915de0cec2cdb928819cd8a22..583810e2628389de07f020badfa4dd4ad6d7366c 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/modelTests.R
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/modelTests.R
@@ -1,4 +1,4 @@
-# Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2016, 2017 Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -79,7 +79,7 @@ check <- function(expected, actual, name) {
 # tests data: formulae
 tests <- c(y~z, y~1+z, y~0+z, y~-1+z, y~z*k, y~z*k+w*m, u~z*k+w*m, y~z:k)
 tests <- c(tests, y~z^2, y~(z+k)^2, y~z*((m+w)^3), y~(z+k)*(w+u))
-tests <- c(tests, y~w%in%v, y~w/k, y~(1 + w/k))
+tests <- c(tests, y~w%in%v, y~w/k, y~(1 + w/k), ~k+y+z)
 ignoremm <- c(y~log(z), y~z+I(k+4), y~z+I(k^2), y~z+offset(log(z)))
 ignoremf <- NULL
 tests <- c(tests, ignoremm)