diff --git a/grouper-midpoint-demo/objects/resources/ldap-edu.xml b/grouper-midpoint-demo/objects/resources/ldap-edu.xml
new file mode 100644
index 0000000..b8f1e0f
--- /dev/null
+++ b/grouper-midpoint-demo/objects/resources/ldap-edu.xml
@@ -0,0 +1,233 @@
+
+
+
+
+
+
+
+
+ OpenLDAP edu
+
+
+
+
+ c:connectorType
+ com.evolveum.polygon.connector.ldap.LdapConnector
+
+
+
+
+
+
+ 389
+ grouper
+ dc=internet2,dc=edu
+ cn=root,dc=internet2,dc=edu
+
+ password
+
+ always
+ spr
+ SSHA
+
+ memberOf
+ createTimestamp
+
+
+ false
+ false
+ false
+
+
+
+
+
+ ri:inetOrgPerson
+ ri:eduPerson
+ ri:groupOfUniqueNames
+ ri:groupOfNames
+ ri:organizationalUnit
+
+
+
+
+
+ account
+ Normal Account
+ true
+ ri:inetOrgPerson
+ ri:eduPerson
+
+ [ri:dn]
+ Distinguished Name
+
+ 0
+
+ mr:stringIgnoreCase
+
+
+ [ri:entryUUID]
+ Entry UUID
+
+
+ true
+ false
+ true
+
+
+ mr:stringIgnoreCase
+
+
+ [ri:cn]
+ Common Name
+
+ 0
+
+
+
+ fullName
+
+
+
+
+ [ri:sn]
+ Surname
+
+ 0
+
+
+
+ familyName
+
+
+
+
+ [ri:givenName]
+ Given Name
+
+
+ givenName
+
+
+
+
+ [ri:uid]
+ Login Name
+ mr:stringIgnoreCase
+
+
+ name
+
+
+
+
+ [ri:mail]
+ Mail
+ mr:stringIgnoreCase
+
+
+ emailAddress
+
+
+
+
+ [ri:employeeNumber]
+
+
+ employeeNumber
+
+
+
+
+ [ri:businessCategory]
+
+
+ extension/ldap_businessCategory
+
+
+
+
+ [ri:eduPersonAffiliation]
+
+
+ extension/ldap_eduPersonAffiliation
+
+
+
+
+
+
+ http://prism.evolveum.com/xml/ns/public/matching-rule-3#stringIgnoreCase
+ attributes/ri:dn
+ cn=root,dc=internet2,dc=edu
+
+
+
+
+
+
+
+
+
+ true
+
+
+
+ name
+
+
+ declare namespace ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3";
+ $account/attributes/ri:uid
+
+
+
+
+
+
+ linked
+ true
+
+
+ deleted
+ true
+
+ http://midpoint.evolveum.com/xml/ns/public/model/action-3#unlink
+
+
+
+
+ unlinked
+ true
+
+ http://midpoint.evolveum.com/xml/ns/public/model/action-3#link
+
+
+
+ unmatched
+ true
+
+ http://midpoint.evolveum.com/xml/ns/public/model/action-3#addFocus
+
+
+
+
+
+
+
+
diff --git a/grouper-midpoint-demo/objects/resources/scriptedsql-grouper.xml b/grouper-midpoint-demo/objects/resources/scriptedsql-grouper.xml
new file mode 100644
index 0000000..9a2e8e6
--- /dev/null
+++ b/grouper-midpoint-demo/objects/resources/scriptedsql-grouper.xml
@@ -0,0 +1,132 @@
+
+
+
+
+ Grouper SQL
+
+
+
+
+ connectorType
+ net.tirasa.connid.bundles.db.scriptedsql.ScriptedSQLConnector
+
+
+
+
+
+
+
+ grouper
+ 3306
+
+ root
+
+
+
+ grouper
+
+ GROOVY
+
+ /opt/midpoint/var/res/SearchScript.groovy
+ /opt/midpoint/var/res/TestScript.groovy
+ /opt/midpoint/var/res/SchemaScript.groovy
+
+ true
+
+
+
+
+
+ org.mariadb.jdbc.Driver
+ jdbc:mysql://%h:%p/%d?useUnicode=true&characterEncoding=utf8&connectionCollation=utf8_bin
+ true
+ true
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+ account
+ Normal Account
+ true
+ ri:AccountObjectClass
+
+ [ri:subject_id]
+ Subject ID
+
+
+ [ri:subject_identifier0]
+ Subject Identifier
+
+
+ [ri:name]
+ Name
+
+
+ [ri:group]
+ Subject Groups
+
+
+ extension/grouper_group
+
+
+
+
+
+
+
+
+ true
+
+
+
+ employeeNumber
+
+
+ declare namespace ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3";
+ $account/attributes/ri:subject_identifier0
+
+
+
+
+
+
+ linked
+ true
+
+
+ deleted
+ true
+
+ http://midpoint.evolveum.com/xml/ns/public/model/action-3#unlink
+
+
+
+
+ unlinked
+ true
+
+ http://midpoint.evolveum.com/xml/ns/public/model/action-3#link
+
+
+
+ unmatched
+ true
+
+
+
+
+
+
+
diff --git a/grouper-midpoint-demo/schema/user-schema.xsd b/grouper-midpoint-demo/schema/user-schema.xsd
new file mode 100644
index 0000000..4b745f1
--- /dev/null
+++ b/grouper-midpoint-demo/schema/user-schema.xsd
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/grouper-midpoint-demo/scriptedsql/grouper/SchemaScript.groovy b/grouper-midpoint-demo/scriptedsql/grouper/SchemaScript.groovy
new file mode 100644
index 0000000..857e6c1
--- /dev/null
+++ b/grouper-midpoint-demo/scriptedsql/grouper/SchemaScript.groovy
@@ -0,0 +1,91 @@
+/*
+ * ====================
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2013 ForgeRock. All rights reserved.
+ *
+ * The contents of this file are subject to the terms of the Common Development
+ * and Distribution License("CDDL") (the "License"). You may not use this file
+ * except in compliance with the License.
+ *
+ * You can obtain a copy of the License at
+ * http://opensource.org/licenses/cddl1.php
+ * See the License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ * When distributing the Covered Code, include this CDDL Header Notice in each file
+ * and include the License file at http://opensource.org/licenses/cddl1.php.
+ * If applicable, add the following below this CDDL Header, with the fields
+ * enclosed by brackets [] replaced by your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ * ====================
+ * Portions Copyrighted 2013 ConnId.
+ */
+import org.identityconnectors.framework.common.objects.AttributeInfo;
+import org.identityconnectors.framework.common.objects.AttributeInfo.Flags;
+import org.identityconnectors.framework.common.objects.AttributeInfoBuilder;
+import org.identityconnectors.framework.common.objects.ObjectClassInfo;
+import org.identityconnectors.framework.common.objects.ObjectClassInfoBuilder;
+
+// Parameters:
+// The connector sends the following:
+// action: a string describing the action ("SCHEMA" here)
+// log: a handler to the Log facility
+// builder: SchemaBuilder instance for the connector
+//
+// The connector will make the final call to builder.build()
+// so the scipt just need to declare the different object types.
+
+// This sample shows how to create 3 basic ObjectTypes: __ACCOUNT__, __GROUP__ and organization.
+// Each of them contains one required attribute and normal String attributes
+
+
+log.info("Entering "+action+" Script");
+
+// Declare the __ACCOUNT__ attributes
+// Make the uid required
+uidAIB = new AttributeInfoBuilder("uid",String.class);
+uidAIB.setRequired(true);
+
+accAttrsInfo = new HashSet();
+accAttrsInfo.add(uidAIB.build());
+accAttrsInfo.add(AttributeInfoBuilder.build("subject_id", String.class));
+accAttrsInfo.add(AttributeInfoBuilder.build("subject_identifier0", String.class));
+accAttrsInfo.add(AttributeInfoBuilder.build("sort_string0", String.class));
+accAttrsInfo.add(AttributeInfoBuilder.build("search_string0", String.class));
+accAttrsInfo.add(AttributeInfoBuilder.build("name", String.class));
+accAttrsInfo.add(AttributeInfoBuilder.build("description", String.class));
+accAttrsInfo.add(AttributeInfoBuilder.build("group", String.class, [Flags.MULTIVALUED] as Set));
+// Create the __ACCOUNT__ Object class
+final ObjectClassInfo ociAccount = new ObjectClassInfoBuilder().setType("__ACCOUNT__").addAllAttributeInfo(accAttrsInfo).build();
+builder.defineObjectClass(ociAccount);
+
+/*
+// Declare the __GROUP__ attributes
+// Make the gid required
+gidAIB = new AttributeInfoBuilder("gid",String.class);
+gidAIB.setRequired(true);
+
+grpAttrsInfo = new HashSet();
+grpAttrsInfo.add(gidAIB.build());
+grpAttrsInfo.add(AttributeInfoBuilder.build("name", String.class));
+grpAttrsInfo.add(AttributeInfoBuilder.build("description", String.class));
+// Create the __GROUP__ Object class
+final ObjectClassInfo ociGroup = new ObjectClassInfoBuilder().setType("__GROUP__").addAllAttributeInfo(grpAttrsInfo).build();
+builder.defineObjectClass(ociGroup);
+
+
+// Declare the organization attributes
+// Make the name required
+nAIB = new AttributeInfoBuilder("name",String.class);
+nAIB.setRequired(true);
+
+orgAttrsInfo = new HashSet();
+orgAttrsInfo.add(nAIB.build());
+orgAttrsInfo.add(AttributeInfoBuilder.build("description", String.class));
+// Create the organization Object class
+final ObjectClassInfo ociOrg = new ObjectClassInfoBuilder().setType("organization").addAllAttributeInfo(orgAttrsInfo).build();
+builder.defineObjectClass(ociOrg);
+*/
+
+log.info("Schema script done");
diff --git a/grouper-midpoint-demo/scriptedsql/grouper/SearchScript.groovy b/grouper-midpoint-demo/scriptedsql/grouper/SearchScript.groovy
new file mode 100644
index 0000000..5da1e92
--- /dev/null
+++ b/grouper-midpoint-demo/scriptedsql/grouper/SearchScript.groovy
@@ -0,0 +1,79 @@
+/*
+ * ====================
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2013 ForgeRock. All rights reserved.
+ *
+ * The contents of this file are subject to the terms of the Common Development
+ * and Distribution License("CDDL") (the "License"). You may not use this file
+ * except in compliance with the License.
+ *
+ * You can obtain a copy of the License at
+ * http://opensource.org/licenses/cddl1.php
+ * See the License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ * When distributing the Covered Code, include this CDDL Header Notice in each file
+ * and include the License file at http://opensource.org/licenses/cddl1.php.
+ * If applicable, add the following below this CDDL Header, with the fields
+ * enclosed by brackets [] replaced by your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ * ====================
+ * Portions Copyrighted 2013 ConnId.
+ */
+import groovy.sql.Sql;
+import groovy.sql.DataSet;
+
+// Parameters:
+// The connector sends the following:
+// connection: handler to the SQL connection
+// objectClass: a String describing the Object class (__ACCOUNT__ / __GROUP__ / other)
+// action: a string describing the action ("SEARCH" here)
+// log: a handler to the Log facility
+// options: a handler to the OperationOptions Map
+// query: a handler to the Query Map
+//
+// The Query map describes the filter used.
+//
+// query = [ operation: "CONTAINS", left: attribute, right: "value", not: true/false ]
+// query = [ operation: "ENDSWITH", left: attribute, right: "value", not: true/false ]
+// query = [ operation: "STARTSWITH", left: attribute, right: "value", not: true/false ]
+// query = [ operation: "EQUALS", left: attribute, right: "value", not: true/false ]
+// query = [ operation: "GREATERTHAN", left: attribute, right: "value", not: true/false ]
+// query = [ operation: "GREATERTHANOREQUAL", left: attribute, right: "value", not: true/false ]
+// query = [ operation: "LESSTHAN", left: attribute, right: "value", not: true/false ]
+// query = [ operation: "LESSTHANOREQUAL", left: attribute, right: "value", not: true/false ]
+// query = null : then we assume we fetch everything
+//
+// AND and OR filter just embed a left/right couple of queries.
+// query = [ operation: "AND", left: query1, right: query2 ]
+// query = [ operation: "OR", left: query1, right: query2 ]
+//
+// Returns: A list of Maps. Each map describing one row.
+// !!!! Each Map must contain a '__UID__' and '__NAME__' attribute.
+// This is required to build a ConnectorObject.
+
+log.info("Entering "+action+" Script");
+
+def sql = new Sql(connection);
+def result = []
+def where = "";
+
+switch ( objectClass ) {
+ case "__ACCOUNT__":
+ sql.eachRow("select m.*, group_concat(distinct g.name) as groups from grouper_members m left join grouper_memberships_all_v gm on m.id=gm.member_id left join grouper_groups g on gm.owner_id=g.id group by m.id", {result.add([__UID__:it.id, __NAME__:it.subject_id, uid:it.id, subject_id:it.subject_id, subject_identifier0:it.subject_identifier0, sort_string0:it.sort_string0, search_string0:it.search_string0, name:it.name, description:it.description, group:it.groups?.tokenize(',')])} );
+ break
+
+/* case "__GROUP__":
+ sql.eachRow("SELECT * FROM Groups" + where, {result.add([__UID__:it.name, __NAME__:it.name, gid:it.gid, ,description:it.description])} );
+ break
+
+ case "organization":
+ sql.eachRow("SELECT * FROM Organizations" + where, {result.add([__UID__:it.name, __NAME__:it.name, description:it.description])} );
+ break */
+
+ default:
+ result;
+}
+
+return result;
diff --git a/grouper-midpoint-demo/scriptedsql/grouper/TestScript.groovy b/grouper-midpoint-demo/scriptedsql/grouper/TestScript.groovy
new file mode 100644
index 0000000..a232c15
--- /dev/null
+++ b/grouper-midpoint-demo/scriptedsql/grouper/TestScript.groovy
@@ -0,0 +1,38 @@
+/*
+ * ====================
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2013 ForgeRock. All rights reserved.
+ *
+ * The contents of this file are subject to the terms of the Common Development
+ * and Distribution License("CDDL") (the "License"). You may not use this file
+ * except in compliance with the License.
+ *
+ * You can obtain a copy of the License at
+ * http://opensource.org/licenses/cddl1.php
+ * See the License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ * When distributing the Covered Code, include this CDDL Header Notice in each file
+ * and include the License file at http://opensource.org/licenses/cddl1.php.
+ * If applicable, add the following below this CDDL Header, with the fields
+ * enclosed by brackets [] replaced by your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ * ====================
+ * Portions Copyrighted 2013 ConnId.
+ */
+import groovy.sql.Sql;
+import groovy.sql.DataSet;
+
+// Parameters:
+// The connector sends the following:
+// connection: handler to the SQL connection
+// action: a string describing the action ("TEST" here)
+// log: a handler to the Log facility
+
+log.info("Entering "+action+" Script");
+def sql = new Sql(connection);
+
+sql.eachRow("select * from grouper_members limit 10", { println it.subject_id } );
+
+