You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by mo...@apache.org on 2017/11/18 20:53:42 UTC

[3/3] zeppelin git commit: [ZEPPELIN-1363] Note level dynamic form

[ZEPPELIN-1363] Note level dynamic form

### What is this PR for?
Added dynamic forms for Note. All paragraphs has access to note forms.

### What type of PR is it?
[Feature]

### What is the Jira issue?
https://issues.apache.org/jira/browse/ZEPPELIN-1363

### How should this be tested?
Create global interpreter JDBC and Spark. Create note with 2 paragraphs
```
%pyspark

print("Textbox paragraph " + z.textbox('input', 'default'))
print("Textbox note " + z.noteTextbox('note_input', 'default_note'))

print("Select paragraph " +  z.select("sel", [("1","opt1"), ("2","opt2"), ("3","opt3")]))
print("Select note " +  z.noteSelect("sel_note", [("1","noteOpt1"), ("2","noteOpt2"), ("3","noteOpt3")]))

options = [("key1","Name1"), ("key2","Name2")]
print("Checkbox paragraph "+ " and ".join(z.checkbox("chk", options, ["key1"])))
print("Checkbox note "+ " and ".join(z.noteCheckbox("chk_note", options, ["key1","key2"])))
```
```
%jdbc

select '$${checkbox:chk_note=key1|key2,key1|key2}   $${note_input} ${note_input=sameName}'
```

### Screenshots (if appropriate)
1) native forms
![1](https://user-images.githubusercontent.com/25951039/32273062-b4d02526-bf22-11e7-9c95-f5aa3b41b8a0.gif)
2) remove
![2](https://user-images.githubusercontent.com/25951039/32273061-b4b0a926-bf22-11e7-8e5c-b26f37da7f61.gif)
3) simple forms
![3](https://user-images.githubusercontent.com/25951039/32273060-b48fff78-bf22-11e7-81be-e1afac00b709.gif)

### Questions:
* Does the licenses files need update? no
* Is there breaking changes for older versions? no
* Does this needs documentation? no

Author: tinkoff-dwh <ti...@gmail.com>

Closes #2641 from tinkoff-dwh/ZEPPELIN-1363 and squashes the following commits:

3ee4826 [tinkoff-dwh] [ZEPPELIN-1363] autosave textbox
f30033a [tinkoff-dwh] Merge remote-tracking branch 'upstream/master' into ZEPPELIN-1363
29eaca2 [tinkoff-dwh] [ZEPPELIN-1363] fix tests
bf8194e [tinkoff-dwh] Merge remote-tracking branch 'upstream/master' into ZEPPELIN-1363
9b2f3e9 [tinkoff-dwh] [ZEPPELIN-1363] button to remove form
c566462 [tinkoff-dwh] [ZEPPELIN-1363] note dynamic forms (simple; native: spark, python)


Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo
Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/50cfabdf
Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/50cfabdf
Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/50cfabdf

Branch: refs/heads/master
Commit: 50cfabdf9b4a55e1bb964376eb5eca22f6046913
Parents: 2a33fd3
Author: tinkoff-dwh <ti...@gmail.com>
Authored: Tue Nov 7 21:33:58 2017 +0500
Committer: Lee moon soo <mo...@apache.org>
Committed: Sat Nov 18 12:53:33 2017 -0800

----------------------------------------------------------------------
 docs/usage/dynamic_form/intro.md                |  43 ++++-
 .../ElasticsearchInterpreterTest.java           |   4 +-
 .../zeppelin/flink/FlinkInterpreterTest.java    |   2 +-
 .../zeppelin/ignite/IgniteInterpreterTest.java  |   2 +-
 .../ignite/IgniteSqlInterpreterTest.java        |   2 +-
 .../zeppelin/jdbc/JDBCInterpreterTest.java      |  12 +-
 .../apache/zeppelin/livy/LivyInterpreterIT.java |  20 +--
 .../graph/neo4j/Neo4jCypherInterpreterTest.java |   1 +
 .../zeppelin/pig/PigInterpreterSparkTest.java   |   4 +-
 .../apache/zeppelin/pig/PigInterpreterTest.java |   4 +-
 .../zeppelin/pig/PigInterpreterTezTest.java     |   4 +-
 .../zeppelin/pig/PigQueryInterpreterTest.java   |   4 +-
 .../zeppelin/python/IPythonInterpreter.java     |   1 +
 .../zeppelin/python/PythonInterpreter.java      |  12 +-
 .../resources/grpc/python/zeppelin_python.py    |  33 ++--
 .../main/resources/python/zeppelin_python.py    |  35 ++--
 .../zeppelin/python/IPythonInterpreterTest.java |   1 +
 .../python/PythonCondaInterpreterTest.java      |   1 +
 .../python/PythonDockerInterpreterTest.java     |   1 +
 .../python/PythonInterpreterMatplotlibTest.java |   1 +
 .../python/PythonInterpreterPandasSqlTest.java  |   1 +
 .../zeppelin/python/PythonInterpreterTest.java  |   1 +
 .../scalding/ScaldingInterpreterTest.java       |   2 +-
 .../zeppelin/scio/ScioInterpreterTest.java      |   1 +
 .../zeppelin/shell/ShellInterpreterTest.java    |   3 +-
 .../zeppelin/spark/PySparkInterpreter.java      |   1 +
 .../apache/zeppelin/spark/SparkInterpreter.java |   1 +
 .../zeppelin/spark/SparkZeppelinContext.java    |  42 ++++-
 .../main/resources/python/zeppelin_pyspark.py   |  40 +++--
 .../zeppelin/spark/DepInterpreterTest.java      |   2 +-
 .../zeppelin/spark/IPySparkInterpreterTest.java |   1 +
 .../spark/PySparkInterpreterMatplotlibTest.java |   1 +
 .../zeppelin/spark/PySparkInterpreterTest.java  |   1 +
 .../zeppelin/spark/SparkInterpreterTest.java    |   2 +
 .../zeppelin/spark/SparkSqlInterpreterTest.java |   2 +-
 .../angular/AbstractAngularElemTest.scala       |   2 +-
 .../angular/AbstractAngularModelTest.scala      |   2 +-
 .../java/org/apache/zeppelin/display/Input.java |  25 ++-
 .../interpreter/BaseZeppelinContext.java        |  94 +++++++++--
 .../interpreter/InterpreterContext.java         |  13 +-
 .../remote/RemoteInterpreterServer.java         |   9 +-
 .../interpreter/thrift/CallbackInfo.java        |   2 +-
 .../thrift/InterpreterCompletion.java           |   2 +-
 .../thrift/RemoteApplicationResult.java         |   2 +-
 .../RemoteInterpreterCallbackService.java       |   2 +-
 .../thrift/RemoteInterpreterContext.java        | 121 +++++++++++++-
 .../thrift/RemoteInterpreterEvent.java          |   2 +-
 .../thrift/RemoteInterpreterResult.java         | 115 ++++++++++++-
 .../thrift/RemoteInterpreterResultMessage.java  |   2 +-
 .../thrift/RemoteInterpreterService.java        |   2 +-
 .../ZeppelinServerResourceParagraphRunner.java  |   2 +-
 .../main/thrift/RemoteInterpreterService.thrift |   4 +-
 .../org/apache/zeppelin/display/InputTest.java  |  18 +--
 .../interpreter/InterpreterContextTest.java     |   2 +-
 .../zeppelin/interpreter/InterpreterTest.java   |   1 +
 .../interpreter/LazyOpenInterpreterTest.java    |   2 +-
 .../apache/zeppelin/socket/NotebookServer.java  |  63 +++++++-
 .../org/apache/zeppelin/AbstractZeppelinIT.java |   4 +
 .../integration/ParagraphActionsIT.java         | 160 +++++++++++++++++++
 .../notebook/dynamic-forms/dynamic-forms.css    |  24 +++
 .../dynamic-forms/dynamic-forms.directive.html  |  86 ++++++++++
 .../dynamic-forms/dynamic-forms.directive.js    |  62 +++++++
 .../src/app/notebook/notebook.controller.js     |  23 +++
 zeppelin-web/src/app/notebook/notebook.html     |  17 ++
 .../paragraph-parameterized-query-form.html     |  71 --------
 .../notebook/paragraph/paragraph.controller.js  |  22 +--
 .../paragraph/paragraph.controller.test.js      |   2 +-
 .../src/app/notebook/paragraph/paragraph.css    |  22 ---
 .../src/app/notebook/paragraph/paragraph.html   |  11 +-
 .../websocket/websocket-event.factory.js        |   2 +
 .../websocket/websocket-message.service.js      |  18 +++
 zeppelin-web/src/index.js                       |   1 +
 .../interpreter/remote/RemoteInterpreter.java   |   7 +-
 .../java/org/apache/zeppelin/notebook/Note.java |  19 +++
 .../org/apache/zeppelin/notebook/Paragraph.java |  45 ++++--
 .../zeppelin/notebook/socket/Message.java       |   6 +-
 .../lifecycle/TimeoutLifecycleManagerTest.java  |   4 +-
 .../remote/RemoteAngularObjectTest.java         |   1 +
 .../RemoteInterpreterOutputTestStream.java      |   1 +
 .../remote/RemoteInterpreterTest.java           |  22 +--
 .../resource/DistributedResourcePoolTest.java   |   1 +
 .../zeppelin/scheduler/RemoteSchedulerTest.java |   3 +
 82 files changed, 1131 insertions(+), 278 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/docs/usage/dynamic_form/intro.md
----------------------------------------------------------------------
diff --git a/docs/usage/dynamic_form/intro.md b/docs/usage/dynamic_form/intro.md
index 7e4f1d4..1da5876 100644
--- a/docs/usage/dynamic_form/intro.md
+++ b/docs/usage/dynamic_form/intro.md
@@ -24,9 +24,10 @@ limitations under the License.
 <div id="toc"></div>
 
 Apache Zeppelin dynamically creates input forms. Depending on language backend, there're two different ways to create dynamic form.
-Custom language backend can select which type of form creation it wants to use.
+Custom language backend can select which type of form creation it wants to use. Forms can have different scope (paragraph or note). 
+Forms with scope "note" available in all paragraphs regardless of which paragraph has code to create these forms.
 
-## Using form Templates
+## Using form Templates (scope: paragraph)
 
 This mode creates form using simple template language. It's simple and easy to use. For example Markdown, Shell, Spark SQL language backend uses it.
 
@@ -81,7 +82,11 @@ Even if you uncheck this option, still you can run it by pressing `Enter`.
 
 <img src="{{BASE_PATH}}/assets/themes/zeppelin/img/screenshots/selectForm-checkbox.png" />
 
-## Creates Programmatically
+## Using form Templates (scope: note)
+
+Has a same syntax but starts with two symbols `$`. (for ex. input `$${forName}`)
+
+## Creates Programmatically (scope: paragraph)
 
 Some language backends can programmatically create forms. For example [ZeppelinContext](../../interpreter/spark.html#zeppelincontext) provides a form creation API
 
@@ -93,7 +98,7 @@ Here are some examples:
 
 {% highlight scala %}
 %spark
-println("Hello "+z.input("name"))
+println("Hello "+z.textbox("name"))
 {% endhighlight %}
 
     </div>
@@ -101,7 +106,7 @@ println("Hello "+z.input("name"))
 
 {% highlight python %}
 %pyspark
-print("Hello "+z.input("name"))
+print("Hello "+z.textbox("name"))
 {% endhighlight %}
 
     </div>
@@ -114,7 +119,7 @@ print("Hello "+z.input("name"))
 
 {% highlight scala %}
 %spark
-println("Hello "+z.input("name", "sun")) 
+println("Hello "+z.textbox("name", "sun")) 
 {% endhighlight %}
 
     </div>
@@ -122,7 +127,7 @@ println("Hello "+z.input("name", "sun"))
 
 {% highlight python %}
 %pyspark
-print("Hello "+z.input("name", "sun"))
+print("Hello "+z.textbox("name", "sun"))
 {% endhighlight %}
 
     </div>
@@ -184,3 +189,27 @@ print("Hello "+ " and ".join(z.checkbox("fruit", options, ["apple"])))
     </div>
 </div>
 <img src="{{BASE_PATH}}/assets/themes/zeppelin/img/screenshots/form_checkbox_prog.png" />
+
+## Creates Programmatically (scope: note)
+
+The difference in the method names:
+
+<table class="table-configuration">
+  <tr>
+    <th>Scope paragraph</th>
+    <th>Scope note</th>
+  </tr>
+  <tr>
+    <td>input (or textbox)</td>
+    <td>noteTextbox</td>
+  </tr>
+  <tr>
+    <td>select</td>
+    <td>noteSelect</td>
+  </tr>
+  <tr>
+    <td>checkbox</td>
+    <td>noteCheckbox</td>
+  </tr>
+</table>
+

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java
----------------------------------------------------------------------
diff --git a/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java b/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java
index 4679f29..64562b1 100644
--- a/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java
+++ b/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java
@@ -164,8 +164,8 @@ public class ElasticsearchInterpreterTest {
 
   private InterpreterContext buildContext(String noteAndParagraphId) {
     final AngularObjectRegistry angularObjReg = new AngularObjectRegistry("elasticsearch", null);
-    return new InterpreterContext(noteAndParagraphId, noteAndParagraphId, null, null, null, null, null,
-        null, angularObjReg , null, null, null);
+    return new InterpreterContext(noteAndParagraphId, noteAndParagraphId, null, null, null, null,
+        null, null, null, angularObjReg , null, null, null);
   }
 
   @Theory

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/flink/src/test/java/org/apache/zeppelin/flink/FlinkInterpreterTest.java
----------------------------------------------------------------------
diff --git a/flink/src/test/java/org/apache/zeppelin/flink/FlinkInterpreterTest.java b/flink/src/test/java/org/apache/zeppelin/flink/FlinkInterpreterTest.java
index d443508..c9cb1f6 100644
--- a/flink/src/test/java/org/apache/zeppelin/flink/FlinkInterpreterTest.java
+++ b/flink/src/test/java/org/apache/zeppelin/flink/FlinkInterpreterTest.java
@@ -40,7 +40,7 @@ public class FlinkInterpreterTest {
     Properties p = new Properties();
     flink = new FlinkInterpreter(p);
     flink.open();
-    context = new InterpreterContext(null, null, null, null, null, null, null, null, null, null, null, null);
+    context = new InterpreterContext(null, null, null, null, null, null, null, null, null, null, null, null, null);
   }
 
   @AfterClass

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteInterpreterTest.java
----------------------------------------------------------------------
diff --git a/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteInterpreterTest.java b/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteInterpreterTest.java
index 9cb5eaf..e8f2265 100644
--- a/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteInterpreterTest.java
+++ b/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteInterpreterTest.java
@@ -40,7 +40,7 @@ public class IgniteInterpreterTest {
   private static final String HOST = "127.0.0.1:47500..47509";
 
   private static final InterpreterContext INTP_CONTEXT =
-      new InterpreterContext(null, null, null, null, null, null, null, null, null, null, null, null);
+      new InterpreterContext(null, null, null, null, null, null, null, null, null, null, null, null, null);
 
   private IgniteInterpreter intp;
   private Ignite ignite;

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteSqlInterpreterTest.java
----------------------------------------------------------------------
diff --git a/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteSqlInterpreterTest.java b/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteSqlInterpreterTest.java
index a6ae0ea..4cb2cbb 100644
--- a/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteSqlInterpreterTest.java
+++ b/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteSqlInterpreterTest.java
@@ -44,7 +44,7 @@ public class IgniteSqlInterpreterTest {
   private static final String HOST = "127.0.0.1:47500..47509";
 
   private static final InterpreterContext INTP_CONTEXT =
-      new InterpreterContext(null, null, null, null, null, null, null, null, null, null, null, null);
+      new InterpreterContext(null, null, null, null, null, null, null, null, null, null, null, null, null);
 
   private Ignite ignite;
   private IgniteSqlInterpreter intp;

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java b/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java
index 1b3f045..6441267 100644
--- a/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java
+++ b/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java
@@ -91,8 +91,8 @@ public class JDBCInterpreterTest extends BasicJDBCTestCaseAdapter {
     PreparedStatement insertStatement = connection.prepareStatement("insert into test_table(id, name) values ('a', 'a_name'),('b', 'b_name'),('c', ?);");
     insertStatement.setString(1, null);
     insertStatement.execute();
-    interpreterContext = new InterpreterContext("", "1", null, "", "", new AuthenticationInfo("testUser"), null, null, null, null,
-        null, null);
+    interpreterContext = new InterpreterContext("", "1", null, "", "",
+        new AuthenticationInfo("testUser"), null, null, null,null, null, null, null);
   }
 
 
@@ -418,7 +418,7 @@ public class JDBCInterpreterTest extends BasicJDBCTestCaseAdapter {
     // user1 runs jdbc1
     jdbc1.open();
     InterpreterContext ctx1 = new InterpreterContext("", "1", "jdbc1", "", "", user1Credential,
-      null, null, null, null, null, null);
+      null, null, null, null, null, null, null);
     jdbc1.interpret("", ctx1);
 
     JDBCUserConfigurations user1JDBC1Conf = jdbc1.getJDBCConfiguration("user1");
@@ -429,7 +429,7 @@ public class JDBCInterpreterTest extends BasicJDBCTestCaseAdapter {
     // user1 runs jdbc2
     jdbc2.open();
     InterpreterContext ctx2 = new InterpreterContext("", "1", "jdbc2", "", "", user1Credential,
-      null, null, null, null, null, null);
+      null, null, null, null, null, null, null);
     jdbc2.interpret("", ctx2);
 
     JDBCUserConfigurations user1JDBC2Conf = jdbc2.getJDBCConfiguration("user1");
@@ -440,7 +440,7 @@ public class JDBCInterpreterTest extends BasicJDBCTestCaseAdapter {
     // user2 runs jdbc1
     jdbc1.open();
     InterpreterContext ctx3 = new InterpreterContext("", "1", "jdbc1", "", "", user2Credential,
-      null, null, null, null, null, null);
+      null, null, null, null, null, null, null);
     jdbc1.interpret("", ctx3);
 
     JDBCUserConfigurations user2JDBC1Conf = jdbc1.getJDBCConfiguration("user2");
@@ -451,7 +451,7 @@ public class JDBCInterpreterTest extends BasicJDBCTestCaseAdapter {
     // user2 runs jdbc2
     jdbc2.open();
     InterpreterContext ctx4 = new InterpreterContext("", "1", "jdbc2", "", "", user2Credential,
-      null, null, null, null, null, null);
+      null, null, null, null, null, null, null);
     jdbc2.interpret("", ctx4);
 
     JDBCUserConfigurations user2JDBC2Conf = jdbc2.getJDBCConfiguration("user2");

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/livy/src/test/java/org/apache/zeppelin/livy/LivyInterpreterIT.java
----------------------------------------------------------------------
diff --git a/livy/src/test/java/org/apache/zeppelin/livy/LivyInterpreterIT.java b/livy/src/test/java/org/apache/zeppelin/livy/LivyInterpreterIT.java
index d413134..ef3eabe 100644
--- a/livy/src/test/java/org/apache/zeppelin/livy/LivyInterpreterIT.java
+++ b/livy/src/test/java/org/apache/zeppelin/livy/LivyInterpreterIT.java
@@ -90,7 +90,7 @@ public class LivyInterpreterIT {
     MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener();
     InterpreterOutput output = new InterpreterOutput(outputListener);
     final InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.spark",
-        "title", "text", authInfo, null, null, null, null, null, output);
+        "title", "text", authInfo, null, null, null, null, null, null, output);
     sparkInterpreter.open();
 
     try {
@@ -211,7 +211,7 @@ public class LivyInterpreterIT {
     MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener();
     InterpreterOutput output = new InterpreterOutput(outputListener);
     InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.spark",
-        "title", "text", authInfo, null, null, null, null, null, output);
+        "title", "text", authInfo, null, null, null, null, null, null, output);
     sparkInterpreter.open();
 
     LivySparkSQLInterpreter sqlInterpreter = new LivySparkSQLInterpreter(properties);
@@ -307,7 +307,7 @@ public class LivyInterpreterIT {
       MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener();
       InterpreterOutput output = new InterpreterOutput(outputListener);
       InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.sql",
-          "title", "text", authInfo, null, null, null, null, null, output);
+          "title", "text", authInfo, null, null, null, null, null, null, output);
       InterpreterResult result = sqlInterpreter.interpret("show tables", context);
       assertEquals(InterpreterResult.Code.SUCCESS, result.code());
       assertEquals(InterpreterResult.Type.TABLE, result.message().get(0).getType());
@@ -334,7 +334,7 @@ public class LivyInterpreterIT {
     MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener();
     InterpreterOutput output = new InterpreterOutput(outputListener);
     final InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.spark",
-        "title", "text", authInfo, null, null, null, null, null, output);
+        "title", "text", authInfo, null, null, null, null, null, null, output);
     sparkInterpreter.open();
 
     final LivySparkSQLInterpreter sqlInterpreter = new LivySparkSQLInterpreter(properties);
@@ -415,7 +415,7 @@ public class LivyInterpreterIT {
     MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener();
     InterpreterOutput output = new InterpreterOutput(outputListener);
     InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.spark",
-        "title", "text", authInfo, null, null, null, null, null, output);
+        "title", "text", authInfo, null, null, null, null, null, null, output);
     sparkInterpreter.open();
 
     LivySparkSQLInterpreter sqlInterpreter = new LivySparkSQLInterpreter(properties);
@@ -481,7 +481,7 @@ public class LivyInterpreterIT {
     MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener();
     InterpreterOutput output = new InterpreterOutput(outputListener);
     InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.spark",
-        "title", "text", authInfo, null, null, null, null, null, output);
+        "title", "text", authInfo, null, null, null, null, null, null, output);
     sparkInterpreter.open();
 
     LivySparkSQLInterpreter sqlInterpreter = new LivySparkSQLInterpreter(newProps);
@@ -538,7 +538,7 @@ public class LivyInterpreterIT {
     MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener();
     InterpreterOutput output = new InterpreterOutput(outputListener);
     final InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.pyspark",
-        "title", "text", authInfo, null, null, null, null, null, output);
+        "title", "text", authInfo, null, null, null, null, null, null, output);
     pysparkInterpreter.open();
 
     // test traceback msg
@@ -665,7 +665,7 @@ public class LivyInterpreterIT {
     MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener();
     InterpreterOutput output = new InterpreterOutput(outputListener);
     InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.spark",
-        "title", "text", authInfo, null, null, null, null, null, output);
+        "title", "text", authInfo, null, null, null, null, null, null, output);
     sparkInterpreter.open();
 
     try {
@@ -703,7 +703,7 @@ public class LivyInterpreterIT {
     MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener();
     InterpreterOutput output = new InterpreterOutput(outputListener);
     final InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.sparkr",
-        "title", "text", authInfo, null, null, null, null, null, output);
+        "title", "text", authInfo, null, null, null, null, null, null, output);
     sparkRInterpreter.open();
 
     try {
@@ -780,7 +780,7 @@ public class LivyInterpreterIT {
       MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener();
       InterpreterOutput output = new InterpreterOutput(outputListener);
       InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.sql",
-          "title", "text", authInfo, null, null, null, null, null, output);
+          "title", "text", authInfo, null, null, null, null, null, null, output);
 
       String p1 = IOUtils.toString(getClass().getResourceAsStream("/livy_tutorial_1.scala"));
       InterpreterResult result = sparkInterpreter.interpret(p1, context);

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/neo4j/src/test/java/org/apache/zeppelin/graph/neo4j/Neo4jCypherInterpreterTest.java
----------------------------------------------------------------------
diff --git a/neo4j/src/test/java/org/apache/zeppelin/graph/neo4j/Neo4jCypherInterpreterTest.java b/neo4j/src/test/java/org/apache/zeppelin/graph/neo4j/Neo4jCypherInterpreterTest.java
index 1bb14b7..9781504 100644
--- a/neo4j/src/test/java/org/apache/zeppelin/graph/neo4j/Neo4jCypherInterpreterTest.java
+++ b/neo4j/src/test/java/org/apache/zeppelin/graph/neo4j/Neo4jCypherInterpreterTest.java
@@ -93,6 +93,7 @@ public class Neo4jCypherInterpreterTest {
             new AuthenticationInfo(),
             new HashMap<String, Object>(),
             new GUI(),
+            new GUI(),
             new AngularObjectRegistry(new InterpreterGroup().getId(), null),
             new LocalResourcePool("id"),
             new LinkedList<InterpreterContextRunner>(),

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterSparkTest.java
----------------------------------------------------------------------
diff --git a/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterSparkTest.java b/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterSparkTest.java
index e821bfe..43ade16 100644
--- a/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterSparkTest.java
+++ b/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterSparkTest.java
@@ -44,8 +44,8 @@ public class PigInterpreterSparkTest {
     properties.put("zeppelin.pig.includeJobStats", includeJobStats + "");
     pigInterpreter = new PigInterpreter(properties);
     pigInterpreter.open();
-    context = new InterpreterContext(null, "paragraph_id", null, null, null, null, null, null, null, null,
-        null, null);
+    context = new InterpreterContext(null, "paragraph_id", null, null, null, null, null, null, null,
+        null, null, null, null);
 
   }
   @After

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTest.java
----------------------------------------------------------------------
diff --git a/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTest.java b/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTest.java
index efcbb58..ac13390 100644
--- a/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTest.java
+++ b/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTest.java
@@ -47,8 +47,8 @@ public class PigInterpreterTest {
     properties.put("zeppelin.pig.includeJobStats", includeJobStats + "");
     pigInterpreter = new PigInterpreter(properties);
     pigInterpreter.open();
-    context = new InterpreterContext(null, "paragraph_id", null, null, null, null, null, null, null, null,
-            null, null);
+    context = new InterpreterContext(null, "paragraph_id", null, null, null,
+        null, null, null, null, null, null,null, null);
   }
 
   @After

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTezTest.java
----------------------------------------------------------------------
diff --git a/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTezTest.java b/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTezTest.java
index 964b31c..48f07bf 100644
--- a/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTezTest.java
+++ b/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTezTest.java
@@ -48,8 +48,8 @@ public class PigInterpreterTezTest {
     properties.put("tez.queue.name", "test");
     pigInterpreter = new PigInterpreter(properties);
     pigInterpreter.open();
-    context = new InterpreterContext(null, "paragraph_id", null, null, null, null, null, null, null, null,
-        null, null);
+    context = new InterpreterContext(null, "paragraph_id", null, null, null, null, null, null, null,
+        null, null, null, null);
 
   }
   @After

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/pig/src/test/java/org/apache/zeppelin/pig/PigQueryInterpreterTest.java
----------------------------------------------------------------------
diff --git a/pig/src/test/java/org/apache/zeppelin/pig/PigQueryInterpreterTest.java b/pig/src/test/java/org/apache/zeppelin/pig/PigQueryInterpreterTest.java
index f14cad6..ad395b5 100644
--- a/pig/src/test/java/org/apache/zeppelin/pig/PigQueryInterpreterTest.java
+++ b/pig/src/test/java/org/apache/zeppelin/pig/PigQueryInterpreterTest.java
@@ -66,8 +66,8 @@ public class PigQueryInterpreterTest {
     pigInterpreter.open();
     pigQueryInterpreter.open();
 
-    context = new InterpreterContext(null, "paragraph_id", null, null, null, null, null, null, null, null,
-            null, null);
+    context = new InterpreterContext(null, "paragraph_id", null, null, null, null, null, null, null,
+        null, null, null, null);
   }
 
   @After

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/main/java/org/apache/zeppelin/python/IPythonInterpreter.java
----------------------------------------------------------------------
diff --git a/python/src/main/java/org/apache/zeppelin/python/IPythonInterpreter.java b/python/src/main/java/org/apache/zeppelin/python/IPythonInterpreter.java
index 77e45b9..2184c1f 100644
--- a/python/src/main/java/org/apache/zeppelin/python/IPythonInterpreter.java
+++ b/python/src/main/java/org/apache/zeppelin/python/IPythonInterpreter.java
@@ -303,6 +303,7 @@ public class IPythonInterpreter extends Interpreter implements ExecuteResultHand
   @Override
   public InterpreterResult interpret(String st, InterpreterContext context) {
     zeppelinContext.setGui(context.getGui());
+    zeppelinContext.setNoteGui(context.getNoteGui());
     interpreterOutput.setInterpreterOutput(context.out);
     ExecuteResponse response =
         ipythonClient.stream_execute(ExecuteRequest.newBuilder().setCode(st).build(),

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java
----------------------------------------------------------------------
diff --git a/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java b/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java
index 4f897c8..051e1fa 100644
--- a/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java
+++ b/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java
@@ -69,6 +69,7 @@ public class PythonInterpreter extends Interpreter implements ExecuteResultHandl
   public static final String DEFAULT_ZEPPELIN_PYTHON = "python";
   public static final String MAX_RESULT = "zeppelin.python.maxResult";
 
+  private PythonZeppelinContext zeppelinContext;
   private InterpreterContext context;
   private Pattern errorInLastLine = Pattern.compile(".*(Error|Exception): .*$");
   private String pythonPath;
@@ -223,6 +224,9 @@ public class PythonInterpreter extends Interpreter implements ExecuteResultHandl
     // try IPythonInterpreter first. If it is not available, we will fallback to the original
     // python interpreter implementation.
     iPythonInterpreter = getIPythonInterpreter();
+    this.zeppelinContext = new PythonZeppelinContext(
+        getInterpreterGroup().getInterpreterHookRegistry(),
+        Integer.parseInt(getProperty("zeppelin.python.maxResult", "1000")));
     if (getProperty("zeppelin.python.useIPython", "true").equals("true") &&
       iPythonInterpreter.checkIPythonPrerequisite()) {
       try {
@@ -374,12 +378,16 @@ public class PythonInterpreter extends Interpreter implements ExecuteResultHandl
     if (iPythonInterpreter != null) {
       return iPythonInterpreter.interpret(cmd, contextInterpreter);
     }
+
     if (cmd == null || cmd.isEmpty()) {
       return new InterpreterResult(Code.SUCCESS, "");
     }
 
     this.context = contextInterpreter;
 
+    zeppelinContext.setGui(context.getGui());
+    zeppelinContext.setNoteGui(context.getNoteGui());
+
     if (!pythonscriptRunning) {
       return new InterpreterResult(Code.ERROR, "python process not running"
         + outputStream.toString());
@@ -559,8 +567,8 @@ public class PythonInterpreter extends Interpreter implements ExecuteResultHandl
     }
   }
 
-  public GUI getGui() {
-    return context.getGui();
+  public PythonZeppelinContext getZeppelinContext() {
+    return zeppelinContext;
   }
 
   String getLocalIp() {

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/main/resources/grpc/python/zeppelin_python.py
----------------------------------------------------------------------
diff --git a/python/src/main/resources/grpc/python/zeppelin_python.py b/python/src/main/resources/grpc/python/zeppelin_python.py
index 0f5638f..1a9e8af 100644
--- a/python/src/main/resources/grpc/python/zeppelin_python.py
+++ b/python/src/main/resources/grpc/python/zeppelin_python.py
@@ -34,26 +34,39 @@ class PyZeppelinContext(object):
     self.max_result = z.getMaxResult()
 
   def input(self, name, defaultValue=""):
-    return self.z.getGui().input(name, defaultValue)
+    return self.z.input(name, defaultValue)
+
+  def textbox(self, name, defaultValue=""):
+    return self.z.textbox(name, defaultValue)
+
+  def noteTextbox(self, name, defaultValue=""):
+    return self.z.noteTextbox(name, defaultValue)
 
   def select(self, name, options, defaultValue=""):
-    javaOptions = gateway.new_array(self.paramOption, len(options))
-    i = 0
-    for tuple in options:
-      javaOptions[i] = self.paramOption(tuple[0], tuple[1])
-      i += 1
-    return self.z.getGui().select(name, defaultValue, javaOptions)
+    return self.z.select(name, defaultValue, self.getParamOptions(options))
+
+  def noteSelect(self, name, options, defaultValue=""):
+    return self.z.noteSelect(name, defaultValue, self.getParamOptions(options))
 
   def checkbox(self, name, options, defaultChecked=[]):
+    return self.z.checkbox(name, self.getDefaultChecked(defaultChecked), self.getParamOptions(options))
+
+  def noteCheckbox(self, name, options, defaultChecked=[]):
+    return self.z.noteCheckbox(name, self.getDefaultChecked(defaultChecked), self.getParamOptions(options))
+
+  def getParamOptions(self, options):
     javaOptions = gateway.new_array(self.paramOption, len(options))
     i = 0
     for tuple in options:
       javaOptions[i] = self.paramOption(tuple[0], tuple[1])
       i += 1
-    javaDefaultCheck = self.javaList()
+    return javaOptions
+
+  def getDefaultChecked(self, defaultChecked):
+    javaDefaultChecked = self.javaList()
     for check in defaultChecked:
-      javaDefaultCheck.append(check)
-    return self.z.getGui().checkbox(name, javaDefaultCheck, javaOptions)
+      javaDefaultChecked.append(check)
+    return javaDefaultChecked
 
   def show(self, p, **kwargs):
     if type(p).__name__ == "DataFrame": # does not play well with sub-classes

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/main/resources/python/zeppelin_python.py
----------------------------------------------------------------------
diff --git a/python/src/main/resources/python/zeppelin_python.py b/python/src/main/resources/python/zeppelin_python.py
index 446201d..519d1af 100644
--- a/python/src/main/resources/python/zeppelin_python.py
+++ b/python/src/main/resources/python/zeppelin_python.py
@@ -64,26 +64,39 @@ class PyZeppelinContext(object):
     return self.z.getCurrentInterpreterContext()
 
   def input(self, name, defaultValue=""):
-    return self.z.getGui().input(name, defaultValue)
+    return self.z.input(name, defaultValue)
+
+  def textbox(self, name, defaultValue=""):
+    return self.z.textbox(name, defaultValue)
+
+  def noteTextbox(self, name, defaultValue=""):
+    return self.z.noteTextbox(name, defaultValue)
 
   def select(self, name, options, defaultValue=""):
-    javaOptions = gateway.new_array(self.paramOption, len(options))
-    i = 0
-    for tuple in options:
-      javaOptions[i] = self.paramOption(tuple[0], tuple[1])
-      i += 1
-    return self.z.getGui().select(name, defaultValue, javaOptions)
+    return self.z.select(name, defaultValue, self.getParamOptions(options))
+
+  def noteSelect(self, name, options, defaultValue=""):
+    return self.z.noteSelect(name, defaultValue, self.getParamOptions(options))
 
   def checkbox(self, name, options, defaultChecked=[]):
+    return self.z.checkbox(name, self.getDefaultChecked(defaultChecked), self.getParamOptions(options))
+
+  def noteCheckbox(self, name, options, defaultChecked=[]):
+    return self.z.noteCheckbox(name, self.getDefaultChecked(defaultChecked), self.getParamOptions(options))
+
+  def getParamOptions(self, options):
     javaOptions = gateway.new_array(self.paramOption, len(options))
     i = 0
     for tuple in options:
       javaOptions[i] = self.paramOption(tuple[0], tuple[1])
       i += 1
-    javaDefaultCheck = self.javaList()
+    return javaOptions
+
+  def getDefaultChecked(self, defaultChecked):
+    javaDefaultChecked = self.javaList()
     for check in defaultChecked:
-      javaDefaultCheck.append(check)
-    return self.z.getGui().checkbox(name, javaDefaultCheck, javaOptions)
+      javaDefaultChecked.append(check)
+    return javaDefaultChecked
 
   def show(self, p, **kwargs):
     if hasattr(p, '__name__') and p.__name__ == "matplotlib.pyplot":
@@ -206,7 +219,7 @@ intp = gateway.entry_point
 intp.onPythonScriptInitialized(os.getpid())
 
 java_import(gateway.jvm, "org.apache.zeppelin.display.Input")
-z = __zeppelin__ = PyZeppelinContext(intp)
+z = __zeppelin__ = PyZeppelinContext(intp.getZeppelinContext())
 __zeppelin__._setup_matplotlib()
 
 _zcUserQueryNameSpace["__zeppelin__"] = __zeppelin__

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/test/java/org/apache/zeppelin/python/IPythonInterpreterTest.java
----------------------------------------------------------------------
diff --git a/python/src/test/java/org/apache/zeppelin/python/IPythonInterpreterTest.java b/python/src/test/java/org/apache/zeppelin/python/IPythonInterpreterTest.java
index 104fe19..6451aa3 100644
--- a/python/src/test/java/org/apache/zeppelin/python/IPythonInterpreterTest.java
+++ b/python/src/test/java/org/apache/zeppelin/python/IPythonInterpreterTest.java
@@ -411,6 +411,7 @@ public class IPythonInterpreterTest {
         new AuthenticationInfo(),
         new HashMap<String, Object>(),
         new GUI(),
+        new GUI(),
         null,
         null,
         null,

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/test/java/org/apache/zeppelin/python/PythonCondaInterpreterTest.java
----------------------------------------------------------------------
diff --git a/python/src/test/java/org/apache/zeppelin/python/PythonCondaInterpreterTest.java b/python/src/test/java/org/apache/zeppelin/python/PythonCondaInterpreterTest.java
index e6f5fca..c750352 100644
--- a/python/src/test/java/org/apache/zeppelin/python/PythonCondaInterpreterTest.java
+++ b/python/src/test/java/org/apache/zeppelin/python/PythonCondaInterpreterTest.java
@@ -131,6 +131,7 @@ public class PythonCondaInterpreterTest {
         new AuthenticationInfo(),
         new HashMap<String, Object>(),
         new GUI(),
+        new GUI(),
         null,
         null,
         null,

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/test/java/org/apache/zeppelin/python/PythonDockerInterpreterTest.java
----------------------------------------------------------------------
diff --git a/python/src/test/java/org/apache/zeppelin/python/PythonDockerInterpreterTest.java b/python/src/test/java/org/apache/zeppelin/python/PythonDockerInterpreterTest.java
index e590394..5634630 100644
--- a/python/src/test/java/org/apache/zeppelin/python/PythonDockerInterpreterTest.java
+++ b/python/src/test/java/org/apache/zeppelin/python/PythonDockerInterpreterTest.java
@@ -86,6 +86,7 @@ public class PythonDockerInterpreterTest {
         new AuthenticationInfo(),
         new HashMap<String, Object>(),
         new GUI(),
+        new GUI(),
         null,
         null,
         null,

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterMatplotlibTest.java
----------------------------------------------------------------------
diff --git a/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterMatplotlibTest.java b/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterMatplotlibTest.java
index 877e428..8c088dc 100644
--- a/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterMatplotlibTest.java
+++ b/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterMatplotlibTest.java
@@ -71,6 +71,7 @@ public class PythonInterpreterMatplotlibTest implements InterpreterOutputListene
         new AuthenticationInfo(),
         new HashMap<String, Object>(),
         new GUI(),
+        new GUI(),
         new AngularObjectRegistry(intpGroup.getId(), null),
         new LocalResourcePool("id"),
         new LinkedList<InterpreterContextRunner>(),

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterPandasSqlTest.java
----------------------------------------------------------------------
diff --git a/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterPandasSqlTest.java b/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterPandasSqlTest.java
index 5d667bd..d8f41c4 100644
--- a/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterPandasSqlTest.java
+++ b/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterPandasSqlTest.java
@@ -83,6 +83,7 @@ public class PythonInterpreterPandasSqlTest implements InterpreterOutputListener
         new AuthenticationInfo(),
         new HashMap<String, Object>(),
         new GUI(),
+        new GUI(),
         new AngularObjectRegistry(intpGroup.getId(), null),
         new LocalResourcePool("id"),
         new LinkedList<InterpreterContextRunner>(),

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterTest.java
----------------------------------------------------------------------
diff --git a/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterTest.java b/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterTest.java
index ef328f0..4f08d50 100644
--- a/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterTest.java
+++ b/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterTest.java
@@ -83,6 +83,7 @@ public class PythonInterpreterTest implements InterpreterOutputListener {
         new AuthenticationInfo(),
         new HashMap<String, Object>(),
         new GUI(),
+        new GUI(),
         new AngularObjectRegistry(group.getId(), null),
         new LocalResourcePool("id"),
         new LinkedList<InterpreterContextRunner>(),

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/scalding/src/test/java/org/apache/zeppelin/scalding/ScaldingInterpreterTest.java
----------------------------------------------------------------------
diff --git a/scalding/src/test/java/org/apache/zeppelin/scalding/ScaldingInterpreterTest.java b/scalding/src/test/java/org/apache/zeppelin/scalding/ScaldingInterpreterTest.java
index 8a23c42..e5b1e90 100644
--- a/scalding/src/test/java/org/apache/zeppelin/scalding/ScaldingInterpreterTest.java
+++ b/scalding/src/test/java/org/apache/zeppelin/scalding/ScaldingInterpreterTest.java
@@ -65,7 +65,7 @@ public class ScaldingInterpreterTest {
 
     InterpreterGroup intpGroup = new InterpreterGroup();
     context = new InterpreterContext("note", "id", null, "title", "text", new AuthenticationInfo(),
-        new HashMap<String, Object>(), new GUI(), new AngularObjectRegistry(
+        new HashMap<String, Object>(), new GUI(), new GUI(), new AngularObjectRegistry(
             intpGroup.getId(), null), null,
         new LinkedList<InterpreterContextRunner>(), null);
   }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/scio/src/test/java/org/apache/zeppelin/scio/ScioInterpreterTest.java
----------------------------------------------------------------------
diff --git a/scio/src/test/java/org/apache/zeppelin/scio/ScioInterpreterTest.java b/scio/src/test/java/org/apache/zeppelin/scio/ScioInterpreterTest.java
index ec17879..91b5fa1 100644
--- a/scio/src/test/java/org/apache/zeppelin/scio/ScioInterpreterTest.java
+++ b/scio/src/test/java/org/apache/zeppelin/scio/ScioInterpreterTest.java
@@ -44,6 +44,7 @@ public class ScioInterpreterTest {
         new AuthenticationInfo(),
         new HashMap<String, Object>(),
         new GUI(),
+        new GUI(),
         new AngularObjectRegistry(intpGroup.getId(), null),
         new LocalResourcePool("id"),
         new LinkedList<InterpreterContextRunner>(),

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/shell/src/test/java/org/apache/zeppelin/shell/ShellInterpreterTest.java
----------------------------------------------------------------------
diff --git a/shell/src/test/java/org/apache/zeppelin/shell/ShellInterpreterTest.java b/shell/src/test/java/org/apache/zeppelin/shell/ShellInterpreterTest.java
index b369f2d..b67170c 100644
--- a/shell/src/test/java/org/apache/zeppelin/shell/ShellInterpreterTest.java
+++ b/shell/src/test/java/org/apache/zeppelin/shell/ShellInterpreterTest.java
@@ -41,7 +41,8 @@ public class ShellInterpreterTest {
     p.setProperty("shell.command.timeout.millisecs", "2000");
     shell = new ShellInterpreter(p);
 
-    context = new InterpreterContext("", "1", null, "", "", null, null, null, null, null, null, null);
+    context = new InterpreterContext("", "1", null, "", "", null, null, null, null, null, null,
+        null, null);
     shell.open();
   }
 

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java
----------------------------------------------------------------------
diff --git a/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java b/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java
index 5df4ec6..21a1649 100644
--- a/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java
+++ b/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java
@@ -464,6 +464,7 @@ public class PySparkInterpreter extends Interpreter implements ExecuteResultHand
     SparkZeppelinContext __zeppelin__ = sparkInterpreter.getZeppelinContext();
     __zeppelin__.setInterpreterContext(context);
     __zeppelin__.setGui(context.getGui());
+    __zeppelin__.setNoteGui(context.getNoteGui());
     pythonInterpretRequest = new PythonInterpretRequest(st, jobGroup, jobDesc);
     statementOutput = null;
 

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java
----------------------------------------------------------------------
diff --git a/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java b/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java
index 71a439f..3e4da19 100644
--- a/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java
+++ b/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java
@@ -1144,6 +1144,7 @@ public class SparkInterpreter extends Interpreter {
   public InterpreterResult interpret(String[] lines, InterpreterContext context) {
     synchronized (this) {
       z.setGui(context.getGui());
+      z.setNoteGui(context.getNoteGui());
       String jobDesc = "Started by: " + Utils.getUserName(context.getAuthenticationInfo());
       sc.setJobGroup(Utils.buildJobGroupId(context), jobDesc, false);
       InterpreterResult r = interpretInput(lines, context);

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/main/java/org/apache/zeppelin/spark/SparkZeppelinContext.java
----------------------------------------------------------------------
diff --git a/spark/src/main/java/org/apache/zeppelin/spark/SparkZeppelinContext.java b/spark/src/main/java/org/apache/zeppelin/spark/SparkZeppelinContext.java
index 09b8d44..92dc0b1 100644
--- a/spark/src/main/java/org/apache/zeppelin/spark/SparkZeppelinContext.java
+++ b/spark/src/main/java/org/apache/zeppelin/spark/SparkZeppelinContext.java
@@ -33,7 +33,6 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.*;
 
-import static scala.collection.JavaConversions.asJavaCollection;
 import static scala.collection.JavaConversions.asJavaIterable;
 import static scala.collection.JavaConversions.collectionAsScalaIterable;
 
@@ -205,9 +204,44 @@ public class SparkZeppelinContext extends BaseZeppelinContext {
       String name,
       scala.collection.Iterable<Object> defaultChecked,
       scala.collection.Iterable<Tuple2<Object, String>> options) {
-    return scala.collection.JavaConversions.asScalaBuffer(
-        gui.checkbox(name, asJavaCollection(defaultChecked),
-            tuplesToParamOptions(options))).toSeq();
+    List<Object> defaultCheckedList = Lists.newArrayList(asJavaIterable(defaultChecked).iterator());
+    Collection<Object> checkbox = checkbox(name, defaultCheckedList, tuplesToParamOptions(options));
+    List<Object> checkboxList = Arrays.asList(checkbox.toArray());
+    return scala.collection.JavaConversions.asScalaBuffer(checkboxList).toSeq();
+  }
+
+  @ZeppelinApi
+  public Object noteSelect(String name, scala.collection.Iterable<Tuple2<Object, String>> options) {
+    return noteSelect(name, "", options);
+  }
+
+  @ZeppelinApi
+  public Object noteSelect(String name, Object defaultValue,
+                       scala.collection.Iterable<Tuple2<Object, String>> options) {
+    return noteSelect(name, defaultValue, tuplesToParamOptions(options));
+  }
+
+  @ZeppelinApi
+  public scala.collection.Seq<Object> noteCheckbox(
+      String name,
+      scala.collection.Iterable<Tuple2<Object, String>> options) {
+    List<Object> allChecked = new LinkedList<>();
+    for (Tuple2<Object, String> option : asJavaIterable(options)) {
+      allChecked.add(option._1());
+    }
+    return noteCheckbox(name, collectionAsScalaIterable(allChecked), options);
+  }
+
+  @ZeppelinApi
+  public scala.collection.Seq<Object> noteCheckbox(
+      String name,
+      scala.collection.Iterable<Object> defaultChecked,
+      scala.collection.Iterable<Tuple2<Object, String>> options) {
+    List<Object> defaultCheckedList = Lists.newArrayList(asJavaIterable(defaultChecked).iterator());
+    Collection<Object> checkbox = noteCheckbox(name, defaultCheckedList,
+        tuplesToParamOptions(options));
+    List<Object> checkboxList = Arrays.asList(checkbox.toArray());
+    return scala.collection.JavaConversions.asScalaBuffer(checkboxList).toSeq();
   }
 
   private OptionInput.ParamOption[] tuplesToParamOptions(

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/main/resources/python/zeppelin_pyspark.py
----------------------------------------------------------------------
diff --git a/spark/src/main/resources/python/zeppelin_pyspark.py b/spark/src/main/resources/python/zeppelin_pyspark.py
index 347b543..c10855a 100644
--- a/spark/src/main/resources/python/zeppelin_pyspark.py
+++ b/spark/src/main/resources/python/zeppelin_pyspark.py
@@ -81,24 +81,46 @@ class PyZeppelinContext(dict):
   def input(self, name, defaultValue=""):
     return self.z.input(name, defaultValue)
 
+  def textbox(self, name, defaultValue=""):
+    return self.z.textbox(name, defaultValue)
+
+  def noteTextbox(self, name, defaultValue=""):
+    return self.z.noteTextbox(name, defaultValue)
+
   def select(self, name, options, defaultValue=""):
     # auto_convert to ArrayList doesn't match the method signature on JVM side
-    tuples = list(map(lambda items: self.__tupleToScalaTuple2(items), options))
-    iterables = gateway.jvm.scala.collection.JavaConversions.collectionAsScalaIterable(tuples)
-    return self.z.select(name, defaultValue, iterables)
+    return self.z.select(name, defaultValue, self.getParamOptions(options))
+
+  def noteSelect(self, name, options, defaultValue=""):
+    return self.z.noteSelect(name, defaultValue, self.getParamOptions(options))
 
   def checkbox(self, name, options, defaultChecked=None):
-    if defaultChecked is None:
-      defaultChecked = []
-    optionTuples = list(map(lambda items: self.__tupleToScalaTuple2(items), options))
-    optionIterables = gateway.jvm.scala.collection.JavaConversions.collectionAsScalaIterable(optionTuples)
-    defaultCheckedIterables = gateway.jvm.scala.collection.JavaConversions.collectionAsScalaIterable(defaultChecked)
-    checkedItems = gateway.jvm.scala.collection.JavaConversions.seqAsJavaList(self.z.checkbox(name, defaultCheckedIterables, optionIterables))
+    optionsIterable = self.getParamOptions(options)
+    defaultCheckedIterables = self.getDefaultChecked(defaultChecked)
+    checkedItems = gateway.jvm.scala.collection.JavaConversions.seqAsJavaList(self.z.checkbox(name, defaultCheckedIterables, optionsIterable))
+    result = []
+    for checkedItem in checkedItems:
+      result.append(checkedItem)
+    return result;
+
+  def noteCheckbox(self, name, options, defaultChecked=None):
+    optionsIterable = self.getParamOptions(options)
+    defaultCheckedIterables = self.getDefaultChecked(defaultChecked)
+    checkedItems = gateway.jvm.scala.collection.JavaConversions.seqAsJavaList(self.z.noteCheckbox(name, defaultCheckedIterables, optionsIterable))
     result = []
     for checkedItem in checkedItems:
       result.append(checkedItem)
     return result;
 
+  def getParamOptions(self, options):
+    tuples = list(map(lambda items: self.__tupleToScalaTuple2(items), options))
+    return gateway.jvm.scala.collection.JavaConversions.collectionAsScalaIterable(tuples)
+
+  def getDefaultChecked(self, defaultChecked):
+    if defaultChecked is None:
+      defaultChecked = []
+    return gateway.jvm.scala.collection.JavaConversions.collectionAsScalaIterable(defaultChecked)
+
   def registerHook(self, event, cmd, replName=None):
     if replName is None:
       self.z.registerHook(event, cmd)

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/test/java/org/apache/zeppelin/spark/DepInterpreterTest.java
----------------------------------------------------------------------
diff --git a/spark/src/test/java/org/apache/zeppelin/spark/DepInterpreterTest.java b/spark/src/test/java/org/apache/zeppelin/spark/DepInterpreterTest.java
index 608807c..e177d49 100644
--- a/spark/src/test/java/org/apache/zeppelin/spark/DepInterpreterTest.java
+++ b/spark/src/test/java/org/apache/zeppelin/spark/DepInterpreterTest.java
@@ -64,7 +64,7 @@ public class DepInterpreterTest {
     dep.setInterpreterGroup(intpGroup);
 
     context = new InterpreterContext("note", "id", null, "title", "text", new AuthenticationInfo(),
-        new HashMap<String, Object>(), new GUI(),
+        new HashMap<String, Object>(), new GUI(), new GUI(),
         new AngularObjectRegistry(intpGroup.getId(), null),
         null,
         new LinkedList<InterpreterContextRunner>(), null);

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/test/java/org/apache/zeppelin/spark/IPySparkInterpreterTest.java
----------------------------------------------------------------------
diff --git a/spark/src/test/java/org/apache/zeppelin/spark/IPySparkInterpreterTest.java b/spark/src/test/java/org/apache/zeppelin/spark/IPySparkInterpreterTest.java
index 5f6d42c..5492274 100644
--- a/spark/src/test/java/org/apache/zeppelin/spark/IPySparkInterpreterTest.java
+++ b/spark/src/test/java/org/apache/zeppelin/spark/IPySparkInterpreterTest.java
@@ -197,6 +197,7 @@ public class IPySparkInterpreterTest {
         new AuthenticationInfo(),
         new HashMap<String, Object>(),
         new GUI(),
+        new GUI(),
         null,
         null,
         null,

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterMatplotlibTest.java
----------------------------------------------------------------------
diff --git a/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterMatplotlibTest.java b/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterMatplotlibTest.java
index 692447e..2f1077d 100644
--- a/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterMatplotlibTest.java
+++ b/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterMatplotlibTest.java
@@ -115,6 +115,7 @@ public class PySparkInterpreterMatplotlibTest {
         new AuthenticationInfo(),
         new HashMap<String, Object>(),
         new GUI(),
+        new GUI(),
         new AngularObjectRegistry(intpGroup.getId(), null),
         new LocalResourcePool("id"),
         new LinkedList<InterpreterContextRunner>(),

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterTest.java
----------------------------------------------------------------------
diff --git a/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterTest.java b/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterTest.java
index a95c5ef..0db2bb1 100644
--- a/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterTest.java
+++ b/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterTest.java
@@ -86,6 +86,7 @@ public class PySparkInterpreterTest {
         new AuthenticationInfo(),
         new HashMap<String, Object>(),
         new GUI(),
+        new GUI(),
         new AngularObjectRegistry(intpGroup.getId(), null),
         new LocalResourcePool("id"),
         new LinkedList<InterpreterContextRunner>(),

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java
----------------------------------------------------------------------
diff --git a/spark/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java b/spark/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java
index 10141a1..e4f15f4 100644
--- a/spark/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java
+++ b/spark/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java
@@ -109,6 +109,7 @@ public class SparkInterpreterTest {
         new AuthenticationInfo(),
         new HashMap<String, Object>(),
         new GUI(),
+        new GUI(),
         new AngularObjectRegistry(intpGroup.getId(), null),
         new LocalResourcePool("id"),
         new LinkedList<InterpreterContextRunner>(),
@@ -335,6 +336,7 @@ public class SparkInterpreterTest {
         new AuthenticationInfo(),
         new HashMap<String, Object>(),
         new GUI(),
+        new GUI(),
         new AngularObjectRegistry(intpGroup.getId(), null),
         new LocalResourcePool("id"),
         new LinkedList<InterpreterContextRunner>(),

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/test/java/org/apache/zeppelin/spark/SparkSqlInterpreterTest.java
----------------------------------------------------------------------
diff --git a/spark/src/test/java/org/apache/zeppelin/spark/SparkSqlInterpreterTest.java b/spark/src/test/java/org/apache/zeppelin/spark/SparkSqlInterpreterTest.java
index 3e33f44..d97e57c 100644
--- a/spark/src/test/java/org/apache/zeppelin/spark/SparkSqlInterpreterTest.java
+++ b/spark/src/test/java/org/apache/zeppelin/spark/SparkSqlInterpreterTest.java
@@ -68,7 +68,7 @@ public class SparkSqlInterpreterTest {
     sql.open();
 
     context = new InterpreterContext("note", "id", null, "title", "text", new AuthenticationInfo(),
-        new HashMap<String, Object>(), new GUI(),
+        new HashMap<String, Object>(), new GUI(), new GUI(),
         new AngularObjectRegistry(intpGroup.getId(), null),
         new LocalResourcePool("id"),
         new LinkedList<InterpreterContextRunner>(), new InterpreterOutput(null));

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularElemTest.scala
----------------------------------------------------------------------
diff --git a/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularElemTest.scala b/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularElemTest.scala
index 43ad1bd..4ddae9a 100644
--- a/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularElemTest.scala
+++ b/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularElemTest.scala
@@ -35,7 +35,7 @@ trait AbstractAngularElemTest
   override def beforeEach() {
     val intpGroup = new InterpreterGroup()
     val context = new InterpreterContext("note", "paragraph", null, "title", "text",
-      new AuthenticationInfo(), new util.HashMap[String, Object](), new GUI(),
+      new AuthenticationInfo(), new util.HashMap[String, Object](), new GUI(), new GUI(),
       new AngularObjectRegistry(intpGroup.getId(), null),
       null,
       new util.LinkedList[InterpreterContextRunner](),

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularModelTest.scala
----------------------------------------------------------------------
diff --git a/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularModelTest.scala b/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularModelTest.scala
index 0ab52ec..c9b0d8f 100644
--- a/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularModelTest.scala
+++ b/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularModelTest.scala
@@ -30,7 +30,7 @@ with BeforeAndAfter with BeforeAndAfterEach with Eventually with Matchers {
   override def beforeEach() {
     val intpGroup = new InterpreterGroup()
     val context = new InterpreterContext("note", "id", null, "title", "text", new AuthenticationInfo(),
-      new java.util.HashMap[String, Object](), new GUI(), new AngularObjectRegistry(
+      new java.util.HashMap[String, Object](), new GUI(), new GUI(), new AngularObjectRegistry(
         intpGroup.getId(), null),
       null,
       new java.util.LinkedList[InterpreterContextRunner](),

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java
index 8a2cd93..a6860de 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java
@@ -155,6 +155,8 @@ public class Input<T> implements Serializable {
   //                                                checkbox form with " or " as delimiter: will be
   //                                                expanded to "US or JP"
   private static final Pattern VAR_PTN = Pattern.compile("([_])?[$][{]([^=}]*([=][^}]*)?)[}]");
+  private static final Pattern VAR_NOTE_PTN =
+      Pattern.compile("([_])?[$]{2}[{]([^=}]*([=][^}]*)?)[}]");
 
   private static String[] getNameAndDisplayName(String str) {
     Pattern p = Pattern.compile("([^(]*)\\s*[(]([^)]*)[)]");
@@ -281,15 +283,21 @@ public class Input<T> implements Serializable {
     return input;
   }
 
-  public static LinkedHashMap<String, Input> extractSimpleQueryForm(String script) {
+  public static LinkedHashMap<String, Input> extractSimpleQueryForm(String script,
+                                                                    boolean noteForm) {
     LinkedHashMap<String, Input> forms = new LinkedHashMap<>();
     if (script == null) {
       return forms;
     }
     String replaced = script;
 
-    Matcher match = VAR_PTN.matcher(replaced);
+    Pattern pattern = noteForm ? VAR_NOTE_PTN : VAR_PTN;
+    Matcher match = pattern.matcher(replaced);
     while (match.find()) {
+      int first = match.start();
+      if (!noteForm && first > 0 && replaced.charAt(first - 1) == '$') {
+        continue;
+      }
       Input form = getInputForm(match);
       forms.put(form.name, form);
     }
@@ -300,11 +308,18 @@ public class Input<T> implements Serializable {
 
   private static final String DEFAULT_DELIMITER = ",";
 
-  public static String getSimpleQuery(Map<String, Object> params, String script) {
+  public static String getSimpleQuery(Map<String, Object> params, String script, boolean noteForm) {
     String replaced = script;
 
-    Matcher match = VAR_PTN.matcher(replaced);
+    Pattern pattern = noteForm ? VAR_NOTE_PTN : VAR_PTN;
+
+    Matcher match = pattern.matcher(replaced);
     while (match.find()) {
+      int first = match.start();
+
+      if (!noteForm && first > 0 && replaced.charAt(first - 1) == '$') {
+        continue;
+      }
       Input input = getInputForm(match);
       Object value;
       if (params.containsKey(input.name)) {
@@ -337,7 +352,7 @@ public class Input<T> implements Serializable {
         expanded = value.toString();
       }
       replaced = match.replaceFirst(expanded);
-      match = VAR_PTN.matcher(replaced);
+      match = pattern.matcher(replaced);
     }
 
     return replaced;

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/BaseZeppelinContext.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/BaseZeppelinContext.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/BaseZeppelinContext.java
index 9503962..65bb06f 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/BaseZeppelinContext.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/BaseZeppelinContext.java
@@ -45,6 +45,7 @@ public abstract class BaseZeppelinContext {
   protected int maxResult;
   protected InterpreterHookRegistry hooks;
   protected GUI gui;
+  protected GUI noteGui;
 
   private static RemoteEventClientWrapper eventClient;
 
@@ -86,37 +87,99 @@ public abstract class BaseZeppelinContext {
   @Deprecated
   @ZeppelinApi
   public Object input(String name, Object defaultValue) {
-    return textbox(name, defaultValue.toString());
+    return textbox(name, defaultValue.toString(), false);
   }
 
   @ZeppelinApi
   public Object textbox(String name) {
-    return textbox(name, "");
+    return textbox(name, "", false);
   }
 
   @ZeppelinApi
   public Object textbox(String name, String defaultValue) {
-    return gui.textbox(name, defaultValue);
+    return textbox(name, defaultValue, false);
+  }
+
+  @ZeppelinApi
+  public Collection<Object> checkbox(String name, ParamOption[] options) {
+    return checkbox(name, options, false);
+  }
+
+  @ZeppelinApi
+  public Collection<Object> checkbox(String name, List<Object> defaultChecked,
+                                     ParamOption[] options) {
+    return checkbox(name, defaultChecked, options, false);
   }
 
+  @ZeppelinApi
   public Object select(String name, Object defaultValue, ParamOption[] paramOptions) {
-    return gui.select(name, defaultValue, paramOptions);
+    return select(name, defaultValue, paramOptions, false);
   }
 
   @ZeppelinApi
-  public Collection<Object> checkbox(String name, ParamOption[] options) {
+  public Object noteTextbox(String name) {
+    return textbox(name, "");
+  }
+
+  @ZeppelinApi
+  public Object noteTextbox(String name, String defaultValue) {
+    return textbox(name, defaultValue, true);
+  }
+
+  @ZeppelinApi
+  public Collection<Object> noteCheckbox(String name, ParamOption[] options) {
+    return checkbox(name, options, true);
+  }
+
+  @ZeppelinApi
+  public Collection<Object> noteCheckbox(String name, List<Object> defaultChecked,
+                                         ParamOption[] options) {
+    return checkbox(name, defaultChecked, options, true);
+  }
+
+  @ZeppelinApi
+  public Object noteSelect(String name, Object defaultValue, ParamOption[] paramOptions) {
+    return select(name, defaultValue, paramOptions, true);
+  }
+
+
+  private Object select(String name, Object defaultValue, ParamOption[] paramOptions,
+                       boolean noteForm) {
+    if (noteForm) {
+      return noteGui.select(name, defaultValue, paramOptions);
+    } else {
+      return gui.select(name, defaultValue, paramOptions);
+    }
+  }
+
+  private Object textbox(String name, String defaultValue, boolean noteForm) {
+    if (noteForm) {
+      return noteGui.textbox(name, defaultValue);
+    } else {
+      return gui.textbox(name, defaultValue);
+    }
+  }
+
+  private Collection<Object> checkbox(String name, ParamOption[] options,
+                                     boolean noteForm) {
     List<Object> defaultValues = new LinkedList<>();
     for (ParamOption option : options) {
       defaultValues.add(option.getValue());
     }
-    return checkbox(name, defaultValues, options);
+    if (noteForm) {
+      return noteGui.checkbox(name, defaultValues, options);
+    } else {
+      return gui.checkbox(name, defaultValues, options);
+    }
   }
 
-  @ZeppelinApi
-  public Collection<Object> checkbox(String name,
-                                     List<Object> defaultValues,
-                                     ParamOption[] options) {
-    return gui.checkbox(name, defaultValues, options);
+  private Collection<Object> checkbox(String name, List<Object> defaultChecked,
+                                      ParamOption[] options, boolean noteForm) {
+    if (noteForm) {
+      return noteGui.checkbox(name, defaultChecked, options);
+    } else {
+      return gui.checkbox(name, defaultChecked, options);
+    }
   }
 
   public void setGui(GUI o) {
@@ -127,6 +190,15 @@ public abstract class BaseZeppelinContext {
     return gui;
   }
 
+
+  public GUI getNoteGui() {
+    return noteGui;
+  }
+
+  public void setNoteGui(GUI noteGui) {
+    this.noteGui = noteGui;
+  }
+
   private void restartInterpreter() {
   }
 

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java
index f5fc70b..293f9bf 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java
@@ -58,6 +58,7 @@ public class InterpreterContext {
   private AuthenticationInfo authenticationInfo;
   private Map<String, Object> config = new HashMap<>();
   private GUI gui = new GUI();
+  private GUI noteGui = new GUI();
   private AngularObjectRegistry angularObjectRegistry;
   private ResourcePool resourcePool;
   private List<InterpreterContextRunner> runners = new ArrayList<>();
@@ -100,13 +101,14 @@ public class InterpreterContext {
                             AuthenticationInfo authenticationInfo,
                             Map<String, Object> config,
                             GUI gui,
+                            GUI noteGui,
                             AngularObjectRegistry angularObjectRegistry,
                             ResourcePool resourcePool,
                             List<InterpreterContextRunner> runners,
                             InterpreterOutput out
                             ) {
     this(noteId, paragraphId, replName, paragraphTitle, paragraphText, authenticationInfo,
-        config, gui, angularObjectRegistry, resourcePool, runners, out, null, null);
+        config, gui, noteGui, angularObjectRegistry, resourcePool, runners, out, null, null);
   }
 
   public InterpreterContext(String noteId,
@@ -117,6 +119,7 @@ public class InterpreterContext {
                             AuthenticationInfo authenticationInfo,
                             Map<String, Object> config,
                             GUI gui,
+                            GUI noteGui,
                             AngularObjectRegistry angularObjectRegistry,
                             ResourcePool resourcePool,
                             List<InterpreterContextRunner> runners,
@@ -132,6 +135,7 @@ public class InterpreterContext {
     this.authenticationInfo = authenticationInfo;
     this.config = config;
     this.gui = gui;
+    this.noteGui = noteGui;
     this.angularObjectRegistry = angularObjectRegistry;
     this.resourcePool = resourcePool;
     this.runners = runners;
@@ -148,6 +152,7 @@ public class InterpreterContext {
                             AuthenticationInfo authenticationInfo,
                             Map<String, Object> config,
                             GUI gui,
+                            GUI noteGui,
                             AngularObjectRegistry angularObjectRegistry,
                             ResourcePool resourcePool,
                             List<InterpreterContextRunner> contextRunners,
@@ -156,7 +161,7 @@ public class InterpreterContext {
                             RemoteInterpreterEventClient eventClient,
                             Map<String, Integer> progressMap) {
     this(noteId, paragraphId, replName, paragraphTitle, paragraphText, authenticationInfo,
-        config, gui, angularObjectRegistry, resourcePool, contextRunners, output,
+        config, gui, noteGui, angularObjectRegistry, resourcePool, contextRunners, output,
         remoteWorksController, progressMap);
     this.client = new RemoteEventClient(eventClient);
   }
@@ -193,6 +198,10 @@ public class InterpreterContext {
     return gui;
   }
 
+  public GUI getNoteGui() {
+    return noteGui;
+  }
+
   public AngularObjectRegistry getAngularObjectRegistry() {
     return angularObjectRegistry;
   }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java
index 86f35c6..c2a578c 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java
@@ -462,7 +462,8 @@ public class RemoteInterpreterServer
     }
     return convert(result,
         context.getConfig(),
-        context.getGui());
+        context.getGui(),
+        context.getNoteGui());
   }
 
   @Override
@@ -749,6 +750,7 @@ public class RemoteInterpreterServer
         (Map<String, Object>) gson.fromJson(ric.getConfig(),
             new TypeToken<Map<String, Object>>() {}.getType()),
         GUI.fromJson(ric.getGui()),
+        GUI.fromJson(ric.getNoteGui()),
         interpreterGroup.getAngularObjectRegistry(),
         interpreterGroup.getResourcePool(),
         contextRunners, output, remoteWorksController, eventClient, progressMap);
@@ -880,7 +882,7 @@ public class RemoteInterpreterServer
   }
 
   private RemoteInterpreterResult convert(InterpreterResult result,
-      Map<String, Object> config, GUI gui) {
+      Map<String, Object> config, GUI gui, GUI noteGui) {
 
     List<RemoteInterpreterResultMessage> msg = new LinkedList<>();
     for (InterpreterResultMessage m : result.message()) {
@@ -893,7 +895,8 @@ public class RemoteInterpreterServer
         result.code().name(),
         msg,
         gson.toJson(config),
-        gui.toJson());
+        gui.toJson(),
+        noteGui.toJson());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/CallbackInfo.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/CallbackInfo.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/CallbackInfo.java
index b0c7e9a..c36a7ac 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/CallbackInfo.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/CallbackInfo.java
@@ -51,7 +51,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
-@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-6-17")
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-10-22")
 public class CallbackInfo implements org.apache.thrift.TBase<CallbackInfo, CallbackInfo._Fields>, java.io.Serializable, Cloneable, Comparable<CallbackInfo> {
   private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("CallbackInfo");
 

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/InterpreterCompletion.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/InterpreterCompletion.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/InterpreterCompletion.java
index 43713e9..2ec653e 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/InterpreterCompletion.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/InterpreterCompletion.java
@@ -51,7 +51,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
-@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-3-27")
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-10-22")
 public class InterpreterCompletion implements org.apache.thrift.TBase<InterpreterCompletion, InterpreterCompletion._Fields>, java.io.Serializable, Cloneable, Comparable<InterpreterCompletion> {
   private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("InterpreterCompletion");
 

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteApplicationResult.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteApplicationResult.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteApplicationResult.java
index cf8e50a..0398bf9 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteApplicationResult.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteApplicationResult.java
@@ -51,7 +51,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
-@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-3-27")
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-10-22")
 public class RemoteApplicationResult implements org.apache.thrift.TBase<RemoteApplicationResult, RemoteApplicationResult._Fields>, java.io.Serializable, Cloneable, Comparable<RemoteApplicationResult> {
   private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("RemoteApplicationResult");
 

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterCallbackService.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterCallbackService.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterCallbackService.java
index 6ef08f6..baa5a2d 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterCallbackService.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterCallbackService.java
@@ -51,7 +51,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
-@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-6-17")
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-10-22")
 public class RemoteInterpreterCallbackService {
 
   public interface Iface {