diff --git a/Tests/Manual/Bindings/AppController.j b/Tests/Manual/Bindings/AppController.j
new file mode 100644
index 000000000..847e5b9ba
--- /dev/null
+++ b/Tests/Manual/Bindings/AppController.j
@@ -0,0 +1,111 @@
+/*
+ * AppController.j
+ * BindingContentArrayTest
+ *
+ * Created by aparajita on August 17, 2011.
+ * Copyright 2011, Victory-Heart Productions All rights reserved.
+ */
+
+@implementation Companies : CPObject
+{
+ CPMutableArray items @accessors;
+}
+
+- (id)init
+{
+ self = [super init];
+
+ if (self)
+ {
+ items = [CPMutableArray array];
+ [items addObject:[CPDictionary dictionaryWithObjectsAndKeys:@"Spacely Sprockets", @"name", [CPArray arrayWithObjects:@"Tom", @"Dick", @"Harry"], @"employees"]];
+ [items addObject:[CPDictionary dictionaryWithObjectsAndKeys:@"Cogswell Cogs", @"name", [CPArray arrayWithObjects:@"Jane", @"Mary", @"Vic"], @"employees"]];
+ }
+
+ return self;
+}
+
+@end
+
+@implementation AppController : CPObject
+{
+ CPString employee @accessors;
+ Companies companies @accessors;
+ CPArrayController companiesController;
+ CPArrayController employeesController;
+}
+
+- (void)applicationDidFinishLaunching:(CPNotification)aNotification
+{
+ var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask],
+ contentView = [theWindow contentView],
+ companiesScrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(30, 30, 200, 100)],
+ companiesTable = [[CPTableView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)],
+ employeesScrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(250, 30, 200, 100)],
+ employeesTable = [[CPTableView alloc] initWithFrame:CGRectMake(0, 0, 200, 100)],
+ text = [[CPTextField alloc] initWithFrame:CGRectMake(250, 140, 200, 29)];
+
+ companies = [Companies new];
+
+ var column = [[CPTableColumn alloc] initWithIdentifier:@"name"];
+
+ [column setResizingMask:CPTableColumnAutoresizingMask];
+ [companiesTable addTableColumn:column];
+ [companiesTable setAllowsMultipleSelection:YES];
+ [companiesTable setColumnAutoresizingStyle:CPTableViewLastColumnOnlyAutoresizingStyle];
+ [companiesScrollView setHasHorizontalScroller:NO];
+ [companiesScrollView setHasVerticalScroller:NO];
+ [companiesScrollView setDocumentView:companiesTable];
+ [companiesScrollView setBorderType:CPBezelBorder];
+ [companiesTable setHeaderView:nil];
+ [companiesTable setAllowsEmptySelection:NO];
+
+ [contentView addSubview:companiesScrollView];
+
+ column = [[CPTableColumn alloc] initWithIdentifier:@"name"];
+
+ [column setResizingMask:CPTableColumnAutoresizingMask];
+ [employeesTable addTableColumn:column];
+ [employeesTable setAllowsMultipleSelection:YES];
+ [employeesTable setColumnAutoresizingStyle:CPTableViewLastColumnOnlyAutoresizingStyle];
+ [employeesScrollView setHasHorizontalScroller:NO];
+ [employeesScrollView setHasVerticalScroller:NO];
+ [employeesScrollView setDocumentView:employeesTable];
+ [employeesScrollView setBorderType:CPBezelBorder];
+ [employeesTable setHeaderView:nil];
+ [employeesTable setAllowsEmptySelection:YES];
+
+ [contentView addSubview:employeesScrollView];
+ [contentView addSubview:text];
+
+ companiesController = [CPArrayController new];
+ [companiesController bind:@"contentArray" toObject:companies withKeyPath:@"items" options:nil];
+
+ employeesController = [CPArrayController new];
+ [employeesController bind:@"contentArray" toObject:companiesController withKeyPath:@"selection.employees" options:nil];
+
+ //var employeeController = [CPObjectController new];
+
+ //[employeeController bind:@"contentObject" toObject:self withKeyPath:@"employee" options:nil];
+
+ [[companiesTable tableColumnWithIdentifier:@"name"] bind:@"value" toObject:companiesController withKeyPath:@"arrangedObjects.name" options:nil];
+ [[employeesTable tableColumnWithIdentifier:@"name"] bind:@"value" toObject:employeesController withKeyPath:@"arrangedObjects" options:nil];
+ [text bind:@"value" toObject:employeesController withKeyPath:@"selection.self" options:nil];
+
+ [companiesController addObserver:self forKeyPath:@"selection" options:0 context:@"companies.selection"];
+ [companiesController addObserver:self forKeyPath:@"selectionIndexes" options:0 context:@"companies.selectionIndexes"];
+ [companiesController addObserver:self forKeyPath:@"arrangedObjects" options:0 context:@"companies.arrangedObjects"];
+ [employeesController addObserver:self forKeyPath:@"selectionIndexes" options:0 context:@"employees.selectionIndexes"];
+ [employeesController addObserver:self forKeyPath:@"selection" options:0 context:@"employees.selection"];
+ [employeesController addObserver:self forKeyPath:@"arrangedObjects" options:0 context:@"employees.arrangedObjects"];
+
+ [theWindow setInitialFirstResponder:companiesTable];
+ [theWindow orderFront:self];
+}
+
+- (void)observeValueForKeyPath:(CPString)keyPath ofObject:(id)object change:(CPDictionary)change context:(id)context
+{
+ console.log("\nkeyPath: %s\ncontext: %s\nnew: %s\nold: %s", keyPath, context, [[change valueForKey:CPKeyValueChangeNewKey] description], [[change valueForKey:CPKeyValueChangeOldKey] description]);
+}
+
+@end
diff --git a/Tests/Manual/Bindings/Info.plist b/Tests/Manual/Bindings/Info.plist
new file mode 100644
index 000000000..49f8e3347
--- /dev/null
+++ b/Tests/Manual/Bindings/Info.plist
@@ -0,0 +1,12 @@
+
+
+
+
+ CPApplicationDelegateClass
+ AppController
+ CPBundleName
+ BindingContentArrayTest
+ CPPrincipalClass
+ CPApplication
+
+
diff --git a/Tests/Manual/Bindings/Jakefile b/Tests/Manual/Bindings/Jakefile
new file mode 100644
index 000000000..a5d4665b0
--- /dev/null
+++ b/Tests/Manual/Bindings/Jakefile
@@ -0,0 +1,93 @@
+/*
+ * Jakefile
+ * BindingContentArrayTest
+ *
+ * Created by aparajita on August 17, 2011.
+ * Copyright 2011, Victory-Heart Productions All rights reserved.
+ */
+
+var ENV = require("system").env,
+ FILE = require("file"),
+ JAKE = require("jake"),
+ task = JAKE.task,
+ FileList = JAKE.FileList,
+ app = require("cappuccino/jake").app,
+ configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug",
+ OS = require("os");
+
+app ("BindingContentArrayTest", function(task)
+{
+ task.setBuildIntermediatesPath(FILE.join("Build", "BindingContentArrayTest.build", configuration));
+ task.setBuildPath(FILE.join("Build", configuration));
+
+ task.setProductName("BindingContentArrayTest");
+ task.setIdentifier("com.aparajita.BindingContentArrayTest");
+ task.setVersion("1.0");
+ task.setAuthor("Victory-Heart Productions");
+ task.setEmail("feedback @nospam@ yourcompany.com");
+ task.setSummary("BindingContentArrayTest");
+ task.setSources((new FileList("**/*.j")).exclude(FILE.join("Build", "**")));
+ task.setResources(new FileList("Resources/**"));
+ task.setIndexFilePath("index.html");
+ task.setInfoPlistPath("Info.plist");
+
+ if (configuration === "Debug")
+ task.setCompilerFlags("-DDEBUG -g");
+ else
+ task.setCompilerFlags("-O");
+});
+
+task ("default", ["BindingContentArrayTest"], function()
+{
+ printResults(configuration);
+});
+
+task ("build", ["default"]);
+
+task ("debug", function()
+{
+ ENV["CONFIGURATION"] = "Debug";
+ JAKE.subjake(["."], "build", ENV);
+});
+
+task ("release", function()
+{
+ ENV["CONFIGURATION"] = "Release";
+ JAKE.subjake(["."], "build", ENV);
+});
+
+task ("run", ["debug"], function()
+{
+ OS.system(["open", FILE.join("Build", "Debug", "BindingContentArrayTest", "index.html")]);
+});
+
+task ("run-release", ["release"], function()
+{
+ OS.system(["open", FILE.join("Build", "Release", "BindingContentArrayTest", "index.html")]);
+});
+
+task ("deploy", ["release"], function()
+{
+ FILE.mkdirs(FILE.join("Build", "Deployment", "BindingContentArrayTest"));
+ OS.system(["press", "-f", FILE.join("Build", "Release", "BindingContentArrayTest"), FILE.join("Build", "Deployment", "BindingContentArrayTest")]);
+ printResults("Deployment")
+});
+
+task ("desktop", ["release"], function()
+{
+ FILE.mkdirs(FILE.join("Build", "Desktop", "BindingContentArrayTest"));
+ require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "BindingContentArrayTest"), FILE.join("Build", "Desktop", "BindingContentArrayTest", "BindingContentArrayTest.app"));
+ printResults("Desktop")
+});
+
+task ("run-desktop", ["desktop"], function()
+{
+ OS.system([FILE.join("Build", "Desktop", "BindingContentArrayTest", "BindingContentArrayTest.app", "Contents", "MacOS", "NativeHost"), "-i"]);
+});
+
+function printResults(configuration)
+{
+ print("----------------------------");
+ print(configuration+" app built at path: "+FILE.join("Build", configuration, "BindingContentArrayTest"));
+ print("----------------------------");
+}
diff --git a/Tests/Manual/Bindings/README.md b/Tests/Manual/Bindings/README.md
new file mode 100644
index 000000000..0c9922fd9
--- /dev/null
+++ b/Tests/Manual/Bindings/README.md
@@ -0,0 +1,14 @@
+Run this application with the current master, and note the following bugs:
+
+- When you click on any item, there are two selection change notifications instead of one.
+
+- If you compare the order of the notifications with Cocoa, they are slightly different.
+
+- The right hand table is configured to allow an empty selection. If you click in the
+empty area below the names, there is an empty selection notification, but then the
+the current selection changes to the first item and generates another notification.
+
+- If you select multiple items on the left, there is an error. This is a bug that will
+have to be fixed in a later commit.
+
+If you apply the changes in these commits, the first three bugs are fixed.
diff --git a/Tests/Manual/Bindings/Resources/spinner.gif b/Tests/Manual/Bindings/Resources/spinner.gif
new file mode 100644
index 000000000..06dbc2bc2
Binary files /dev/null and b/Tests/Manual/Bindings/Resources/spinner.gif differ
diff --git a/Tests/Manual/Bindings/index-debug.html b/Tests/Manual/Bindings/index-debug.html
new file mode 100644
index 000000000..9463d3392
--- /dev/null
+++ b/Tests/Manual/Bindings/index-debug.html
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Bindings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Tests/Manual/Bindings/index.html b/Tests/Manual/Bindings/index.html
new file mode 100644
index 000000000..3616a73b2
--- /dev/null
+++ b/Tests/Manual/Bindings/index.html
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Bindings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Tests/Manual/Bindings/main.j b/Tests/Manual/Bindings/main.j
new file mode 100644
index 000000000..a3894cf42
--- /dev/null
+++ b/Tests/Manual/Bindings/main.j
@@ -0,0 +1,18 @@
+/*
+ * AppController.j
+ * BindingContentArrayTest
+ *
+ * Created by aparajita on August 17, 2011.
+ * Copyright 2011, Victory-Heart Productions All rights reserved.
+ */
+
+@import
+@import
+
+@import "AppController.j"
+
+
+function main(args, namedArgs)
+{
+ CPApplicationMain(args, namedArgs);
+}