diff --git a/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java
index d373c46..2bc348a 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java
@@ -17,6 +17,7 @@
 import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.syntax.compiler.DebugInfo;
 import com.google.devtools.build.lib.syntax.compiler.LoopLabels;
 import com.google.devtools.build.lib.syntax.compiler.VariableScope;
@@ -33,6 +34,7 @@
   private final ImmutableMap<Identifier, String> symbols;
   private final ImmutableList<Identifier> cachedSymbols; // to save time
   private final SkylarkImport imp;
+  private final Location importLocation;
 
   /**
    * Constructs an import statement.
@@ -41,12 +43,17 @@
    * the bzl file that should be loaded. If aliasing is used, the value differs from its key's
    * {@code symbol.getName()}. Otherwise, both values are identical.
    */
-  LoadStatement(SkylarkImport imp, Map<Identifier, String> symbols) {
+  LoadStatement(SkylarkImport imp, Location importLocation, Map<Identifier, String> symbols) {
     this.imp = imp;
+    this.importLocation = importLocation;
     this.symbols = ImmutableMap.copyOf(symbols);
     this.cachedSymbols = ImmutableList.copyOf(symbols.keySet());
   }
 
+  public Location getImportLocation() {
+    return importLocation;
+  }
+
   public ImmutableList<Identifier> getSymbols() {
     return cachedSymbols;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
index 023a85b..aa37796 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
@@ -1052,7 +1052,7 @@
       return;
     }
 
-    StringLiteral path = parseStringLiteral();
+    StringLiteral importString = parseStringLiteral();
     expect(TokenKind.COMMA);
 
     Map<Identifier, String> symbols = new HashMap<>();
@@ -1070,13 +1070,13 @@
 
     SkylarkImport imp;
     try {
-      imp = SkylarkImports.create(path.getValue());
-      LoadStatement stmt = new LoadStatement(imp, symbols);
+      imp = SkylarkImports.create(importString.getValue());
+      LoadStatement stmt = new LoadStatement(imp, importString.getLocation(), symbols);
       list.add(setLocation(stmt, start, token.left));
     } catch (SkylarkImportSyntaxException e) {
-      String msg = "Load statement parameter '" + path + "' is invalid. "
+      String msg = "Load statement parameter '" + importString + "' is invalid. "
           + e.getMessage();
-      reportError(path.getLocation(), msg);
+      reportError(importString.getLocation(), msg);
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
index 2985fd1..8e51987 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
@@ -1083,13 +1083,22 @@
 
   @Test
   public void testValidAbsoluteImportPath() {
+    String importString = "/some/skylark/file";
     List<Statement> statements =
-        parseFileForSkylark("load('/some/skylark/file', 'fun_test')\n");
+        parseFileForSkylark("load('" + importString + "', 'fun_test')\n");
     LoadStatement stmt = (LoadStatement) statements.get(0);
     SkylarkImport imp = stmt.getImport();
-    assertThat(imp.getImportString()).isEqualTo("/some/skylark/file");
-    assertThat(imp.hasAbsolutePath()).isTrue();
-    assertThat(imp.getAbsolutePath()).isEqualTo(new PathFragment("/some/skylark/file.bzl"));
+
+    assertThat(imp.getImportString()).named("getImportString()").isEqualTo("/some/skylark/file");
+    assertThat(imp.hasAbsolutePath()).named("hasAbsolutePath()").isTrue();
+    assertThat(imp.getAbsolutePath()).named("getAbsolutePath()")
+        .isEqualTo(new PathFragment("/some/skylark/file.bzl"));
+
+    int startOffset = stmt.getImportLocation().getStartOffset();
+    int endOffset = stmt.getImportLocation().getEndOffset();
+    assertThat(startOffset).named("getStartOffset()").isEqualTo(5);
+    assertThat(endOffset).named("getEndOffset()")
+        .isEqualTo(startOffset + importString.length() + 2);
   }
 
   private void validNonAbsoluteImportTest(String importString, String containingFileLabelString,
@@ -1098,11 +1107,19 @@
         parseFileForSkylark("load('" + importString + "', 'fun_test')\n");
     LoadStatement stmt = (LoadStatement) statements.get(0);
     SkylarkImport imp = stmt.getImport();
-    assertThat(imp.getImportString()).isEqualTo(importString);
-    assertThat(imp.hasAbsolutePath()).isFalse();
+
+    assertThat(imp.getImportString()).named("getImportString()").isEqualTo(importString);
+    assertThat(imp.hasAbsolutePath()).named("hasAbsolutePath()").isFalse();
+
     Label containingFileLabel = Label.parseAbsoluteUnchecked(containingFileLabelString);
-    assertThat(imp.getLabel(containingFileLabel))
-    .isEqualTo(Label.parseAbsoluteUnchecked(expectedLabelString));      
+    assertThat(imp.getLabel(containingFileLabel)).named("containingFileLabel()")
+        .isEqualTo(Label.parseAbsoluteUnchecked(expectedLabelString)); 
+
+    int startOffset = stmt.getImportLocation().getStartOffset();
+    int endOffset = stmt.getImportLocation().getEndOffset();
+    assertThat(startOffset).named("getStartOffset()").isEqualTo(5);
+    assertThat(endOffset).named("getEndOffset()")
+        .isEqualTo(startOffset + importString.length() + 2);
   }
 
   private void invalidImportTest(String importString, String expectedMsg) {
