diff --git a/asterix-app/src/main/resources/sdk/static/js/asterix-api-core.js b/asterix-app/src/main/resources/sdk/static/js/asterix-api-core.js
index e98b2c9..9478885 100644
--- a/asterix-app/src/main/resources/sdk/static/js/asterix-api-core.js
+++ b/asterix-app/src/main/resources/sdk/static/js/asterix-api-core.js
@@ -109,11 +109,16 @@
 // Components: 
 //      boundTo -> a "next" expression
 function AsterixExpression() {
+    this.init();
+    return this;
+}
+
+AsterixExpression.prototype.init = function () {
     this.boundTo = {};
-    this.value = "";
+    this.clauses = [];
     this.ui_callback_on_success = function() {};
     this.ui_callback_on_success_async = function() {};
-}
+};
 
 // AsterixExpression => bind
 //
@@ -126,10 +131,10 @@
     if (expression instanceof AsterixExpression) {
         this.boundTo = expression;
     } else if (expression instanceof AsterixClause) {
-        alert("Clause");
+        this.clauses.push(expression.val());
     }
     return this;
-}
+};
 
 // AsterixExpression => send
 //
@@ -139,7 +144,22 @@
     // Hackiest of hacks
     var g = new AsterixSDK();
     g.send(arc, arc["callback"]);
-}
+};
+
+// AsterixExpression => clear
+//
+// Clears clauses array
+AsterixExpression.prototype.clear = function() {
+    this.clauses.length = 0;
+    return this;
+};
+
+// AsterixExpression => value
+//
+// Retrieves string value of current expression
+AsterixExpression.prototype.val = function() {
+    return this.clauses.join("\n"); 
+};
 
 // AsterixExpression => success
 //
@@ -151,27 +171,47 @@
     } else { 
         this.ui_callback_on_success_async = fn;
     }
+    return this;
 };
 
-function CreateExpression() {} // "create" ( "type" | "nodegroup" | "external" <DATASET> | <DATASET> | "index" | "dataverse" 
-function FLWOGRExpression() {} // ( ForClause | LetClause ) ( Clause )* "return" Expression
+// AsterixExpression => set
+// Pushes statements onto the clause stack
+//
+// TODO typecheck
+// @param statements_arr [ARRAY]
+AsterixExpression.prototype.set = function(statements_arr) {
+    for (var i = 0; i < statements_arr.length; i++) {
+        this.clauses.push(statements_arr[i]);
+    }
+    return this;
+};
 
-//TODO
-function LegacyExpression() {} // Legacy for old AsterixAPI version: handle hardcoded strings. Will phase out.
+function CreateExpression() { 
+    AsterixExpression.prototype.init.call(this);
+    return this; 
+} // "create" ( "type" | "nodegroup" | "external" <DATASET> | <DATASET> | "index" | "dataverse" 
+
+
+function FLWOGRExpression() { 
+    AsterixExpression.prototype.init.call(this);
+    return this; 
+} // ( ForClause | LetClause ) ( Clause )* "return" Expression
+
+
+function LegacyExpression() { 
+    AsterixExpression.prototype.init.call(this);
+    return this; 
+} // Legacy for old AsterixAPI version: handle hardcoded strings. Will phase out.
 
 inherit(CreateExpression, AsterixExpression);
 inherit(FLWOGRExpression, AsterixExpression);
 inherit(LegacyExpression, AsterixExpression);
 
-CreateExpression.prototype.set = function(statement) {
-    this.value = statement;
-};
-
 CreateExpression.prototype.send = function() {
     myThis = this;
     var arc = new AsterixRESTController();
     arc.DDL(
-        { "ddl" : myThis.value },
+        { "ddl" : myThis.val() },
         {
             "sync" : function () {}, // TODO This should be a default value out of the AsterixExpression base
             "async" : function () {}
@@ -185,14 +225,6 @@
 // LegacyExpression
 // Handles hardcoded query strings from prior versions
 // of this API. Can be useful for debugging.
-LegacyExpression.prototype.set = function(statement) {
-    this.value = statement;
-};
-
-LegacyExpression.prototype.get = function() {
-    return this.value;
-};
-
 LegacyExpression.prototype.send = function(endpoint, json) {
     
     var arc = {
@@ -210,6 +242,7 @@
 
 LegacyExpression.prototype.extra = function(extras) {
     this.extras = extras;
+    return this;
 }
 
 //
@@ -217,20 +250,26 @@
 //
 function AsterixClause() {
     this.clause = "";
+    return this;
 }
 
 AsterixClause.prototype.val = function() {
     return this.clause;
 };
 
-function ForClause() {}     // "for" Variable ( "at" Variable )? "in" ( Expression )
-function LetClause() {}     // "let" Variable ":=" Expression
-function WhereClause() {}   // "where" Expression
-function OrderbyClause() {}   // ( "order" "by" Expression ( ( "asc" ) | ( "desc" ) )? ( "," Expression ( ( "asc" ) | ( "desc" ) )? )* )
-function GroupClause() {}     //  "group" "by" ( Variable ":=" )? Expression ( "," ( Variable ":=" )? Expression )* 
-                            //      ( "decor" Variable ":=" Expression ( "," "decor" Variable ":=" Expression )* )? "with" VariableRef ( "," VariableRef )*
-function LimitClause() {}     // "limit" Expression ( "offset" Expression )?
-function DistinctClause() {}  // "distinct" "by" Expression ( "," Expression )*
+AsterixClause.prototype.set = function(clause) {
+    this.clause = clause;
+    return this;
+};
+
+function ForClause() {}         // "for" Variable ( "at" Variable )? "in" ( Expression )
+function LetClause() {}         // "let" Variable ":=" Expression
+function WhereClause() {}       // "where" Expression
+function OrderbyClause() {}     // ( "order" "by" Expression ( ( "asc" ) | ( "desc" ) )? ( "," Expression ( ( "asc" ) | ( "desc" ) )? )* )
+function GroupClause() {}       //  "group" "by" ( Variable ":=" )? Expression ( "," ( Variable ":=" )? Expression )* 
+                                //      ( "decor" Variable ":=" Expression ( "," "decor" Variable ":=" Expression )* )? "with" VariableRef ( "," VariableRef )*
+function LimitClause() {}       // "limit" Expression ( "offset" Expression )?
+function DistinctClause() {}    // "distinct" "by" Expression ( "," Expression )*
 
 inherit(ForClause, AsterixClause);
 inherit(LetClause, AsterixClause);
@@ -240,41 +279,45 @@
 inherit(LimitClause, AsterixClause);
 inherit(DistinctClause, AsterixClause);
 
-ForClause.prototype.set = function() {
-
+ForClause.prototype.set = function(clause) {
+//ForClause.prototype.set = function(for_variable, at_variable, expression) {
+    AsterixClause.prototype.set.call(this, clause); 
     return this;
 };
 
-LetClause.prototype.set = function() {
-
+LetClause.prototype.set = function(clause) {
+    AsterixClause.prototype.set.call(this, clause); 
     return this;
 };
 
-WhereClause.prototype.set = function() {
-
+WhereClause.prototype.set = function(clause) {
+    AsterixClause.prototype.set.call(this, clause); 
     return this;
 };
 
-OrderbyClause.prototype.set = function() {
-
+OrderbyClause.prototype.set = function(clause) {
+    AsterixClause.prototype.set.call(this, clause); 
     return this;
 };
 
-GroupClause.prototype.set = function() {
-
+GroupClause.prototype.set = function(clause) {
+    AsterixClause.prototype.set.call(this, clause); 
     return this;
 };
 
-LimitClause.prototype.set = function() {
-
+LimitClause.prototype.set = function(clause) {
+    AsterixClause.prototype.set.call(this, clause); 
     return this;
 };
 
-DistinctClause.prototype.set = function()  {
-
+DistinctClause.prototype.set = function(clause)  {
+    AsterixClause.prototype.set.call(this, clause); 
     return this;
 };
 
+
+
+
 // Asterix REST Controller
 //
 // Asterix REST Controller
@@ -405,66 +448,6 @@
 }
 
 /*
-// ************************
-// Asterix Query Manager
-// ************************
-
-// FOR REVIEW: This is not a good name, but I have no idea what to name it.
-function AsterixCoreJS() {
-    this.Expression = AQLExpression;
-    this.FLWOGR = AQLFLWOGR;
-    this.IfThenElse = AQLIfThenElse;
-}
-
-// ********************************
-// Asterix REST API Communication
-// ********************************
-function AsterixAPIRequest() {
-   var xmlhttp = new XMLHttpRequest();
-   xmlhttp.open("GET", "http://localhost:19101/query", true);
-   xmlhttp.setRequestHeader('Content-Type', 'application/json');
-   xmlhttp.send(JSON.stringify({"query" : "use dataverse dne;"}));
-   var serverResponse = xmlhttp.responseText;
-   alert(serverResponse);
-}
-
-// ********************
-// Asterix Expressions
-// ********************
-
-function AsterixExpression() {
-
-    // PRIVATE MEMBERS
-    
-    // PROTECTED METHODS
-    // * May be overridden with prototypes
-    // * May access private members
-    // * May not be changed
-   
-    // PUBLIC
-}
-
-// PUBLIC EXPRESSION PROPERTIES
-AsterixExpression.prototype.bindTo = function() {
-
-}
-
-// For some AsterixExpression extension foo:
-// foo.prototype = new AsterixExpression();
-// foo.prototype.constructor = foo;
-// function foo() { // Set properties here }
-// foo.prototype.anotherMethod = function() { // Another example function }
-
-// AsterixFLWOGR
-// Inherits From: AsterixExpression
-//
-// FLWOGR   ::= ( ForClause | LetClause ) ( Clause )* "return" Expression
-AQLFLWOGR.prototype = new AsterixExpression();
-AQLFLWOGR.prototype.constructor = AQLFLWOGR;
-function AQLFLWOGR() {
-
-}
-
 // AsterixIfThenElse
 // Inherits From: AsterixExpression
 //
diff --git a/asterix-examples/src/main/resources/cherry/js/cherry.js b/asterix-examples/src/main/resources/cherry/js/cherry.js
index 0715ffe..3a82362 100755
--- a/asterix-examples/src/main/resources/cherry/js/cherry.js
+++ b/asterix-examples/src/main/resources/cherry/js/cherry.js
@@ -254,16 +254,15 @@
 		    })
 		    .aql_return({ "cell" : "$c", "count" : "count($t)" });
 		    
-        var l = new LegacyExpression();
-        l.extra({
-            "payload" : formData,
-            "query_string" : "use dataverse twitter;\n" + buildCherryQuery.parameters["statements"].join("\n")
-        });
-        l.set(buildCherryQuery.parameters["statements"].join("\n"));
-		l.success(cherryQuerySyncCallback, true);
-		l.success(cherryQueryAsyncCallback, false);
-        
-        l.send("http://localhost:19101/query", 
+        var l = new LegacyExpression()
+            .extra({
+                "payload" : formData,
+                "query_string" : "use dataverse twitter;\n" + buildCherryQuery.parameters["statements"].join("\n")
+            })
+            .set(buildCherryQuery.parameters["statements"])
+		    .success(cherryQuerySyncCallback, true)
+		    .success(cherryQueryAsyncCallback, false)
+            .send("http://localhost:19101/query", 
             {
                 "query" : "use dataverse twitter;\n" + buildCherryQuery.parameters["statements"].join("\n"),
                 "mode" : build_cherry_mode, 
