diff --git a/plugins/flexfile/.project b/plugins/flexfile/.project
new file mode 100644
index 0000000000000000000000000000000000000000..78d356d6a90892a636b234f2bbb48c7095f421f8
--- /dev/null
+++ b/plugins/flexfile/.project
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>flexfile</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.php.core.PhpIncrementalProjectBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.php.core.ValidationManagerWrapper</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.php.core.PHPNature</nature>
+	</natures>
+</projectDescription>
diff --git a/plugins/flexfile/README.txt b/plugins/flexfile/README.txt
index 3c73f6bc8d027945f5e201a9179304985e15b7a0..b9fa1f5db9badd34d10fa06d8f01d83dc9c879d2 100755
--- a/plugins/flexfile/README.txt
+++ b/plugins/flexfile/README.txt
@@ -35,7 +35,7 @@ back to the file upload form. If you want it to be formatted in the same way as
 in the standard file view, put this in your file form display template:
 
 <div class="filerepo_tags">
-{{$file_tags}}
+{$file_tags}
 </div>
 
 (assuming that your tags field is called "file tags").
diff --git a/plugins/flexfile/views/default/file/upload.php b/plugins/flexfile/views/default/file/upload.php
index 4e349da5697d08336af981695ac1656a1583a6e7..d7df0f00eba995925dfd6454bd40089291440489 100755
--- a/plugins/flexfile/views/default/file/upload.php
+++ b/plugins/flexfile/views/default/file/upload.php
@@ -30,7 +30,7 @@
 <div class="contentWrapper">
 <form action="<?php echo $vars['url']; ?>action/<?php echo $action; ?>" enctype="multipart/form-data" method="post">
 <?php
-
+	echo elgg_view('input/securitytoken');
 	if ($action == "file/upload") {
 
 ?>
diff --git a/plugins/flexfile/views/default/object/file.php b/plugins/flexfile/views/default/object/file.php
index a58e57edfc08d0b4532e8248766026ddd20def07..c6631baed382d68fc73a460503020949732675a4 100755
--- a/plugins/flexfile/views/default/object/file.php
+++ b/plugins/flexfile/views/default/object/file.php
@@ -43,7 +43,7 @@
 					echo "<a href=\"{$vars['url']}mod/file/edit.php?file_guid={$file->getGUID()}\">" . elgg_echo('edit') . "</a>&nbsp;";
 					echo elgg_view('output/confirmlink',array(
 						
-							'href' => $vars['url'] . "action/file/delete?file=" . $file->getGUID(),
+							'href' => $vars['url'] . "action/file/delete?file=" . $file->getGUID().'&'.form_add_security_fields(),
 							'text' => elgg_echo("delete"),
 							'confirm' => elgg_echo("file:delete:confirm"),
 						
@@ -93,7 +93,7 @@
 ?>
 	<div class="filerepo_file">
 		<div class="filerepo_icon">
-					<a href="<?php echo $vars['url']; ?>action/file/download?file_guid=<?php echo $file_guid; ?>"><?php 
+					<a href="<?php echo $vars['url']; ?>action/file/download?file_guid=<?php echo $file_guid.'&'.form_add_security_fields(); ?>"><?php 
 						
 						echo elgg_view("file/icon", array("mimetype" => $mime, 'thumbnail' => $file->thumbnail, 'file_guid' => $file_guid)); 
 						
@@ -143,7 +143,7 @@
 		
 		?>
 		
-		<div class="filerepo_download"><p><a href="<?php echo $vars['url']; ?>action/file/download?file_guid=<?php echo $file_guid; ?>"><?php echo elgg_echo("file:download"); ?></a></p></div>
+		<div class="filerepo_download"><p><a href="<?php echo $vars['url']; ?>action/file/download?file_guid=<?php echo $file_guid.'&'.form_add_security_fields(); ?>"><?php echo elgg_echo("file:download"); ?></a></p></div>
 		
 <?php
 
@@ -156,7 +156,7 @@
 					<?php 
 						echo elgg_view('output/confirmlink',array(
 						
-							'href' => $vars['url'] . "action/file/delete?file=" . $file->getGUID(),
+							'href' => $vars['url'] . "action/file/delete?file=" . $file->getGUID().'&'.form_add_security_fields(),
 							'text' => elgg_echo("delete"),
 							'confirm' => elgg_echo("file:delete:confirm"),
 						
diff --git a/plugins/flexgroupprofile/.project b/plugins/flexgroupprofile/.project
new file mode 100644
index 0000000000000000000000000000000000000000..b115d7d909ace11bb00af8990dd7cb635acf1611
--- /dev/null
+++ b/plugins/flexgroupprofile/.project
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>flexgroupprofile</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.php.core.PhpIncrementalProjectBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.php.core.ValidationManagerWrapper</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.php.core.PHPNature</nature>
+	</natures>
+</projectDescription>
diff --git a/plugins/flexgroupprofile/actions/edit.php b/plugins/flexgroupprofile/actions/edit.php
index 3601f6bfbdcae9a6b7f9d5b9e011a104e9a3cea9..f9318abad70f94b57413f7e3190482f8b30eaa1e 100755
--- a/plugins/flexgroupprofile/actions/edit.php
+++ b/plugins/flexgroupprofile/actions/edit.php
@@ -18,6 +18,9 @@ require_once(dirname(dirname(dirname(__FILE__))) . "/form/models/profile.php");
 require_once(dirname(dirname(__FILE__)) . "/models/model.php");
 
 $user_guid = get_input('user_guid');
+$group_owner_username = get_input('group_owner_username','');
+$membership = get_input('membership');
+
 $user = NULL;
 if (!$user_guid) $user = $_SESSION['user'];
 else
@@ -33,33 +36,72 @@ if (($group_guid) && (!$group->canEdit()))
 	exit;
 }
 
+// Set access - all groups are public from elgg's point of view, unless the override is in place
+
+if (get_plugin_setting('hidden_groups', 'groups') == 'yes')
+{
+	$visibility = (int)get_input('vis','',false);
+	
+	$group->access_id = $visibility;
+	
+	$group->access_id;
+}
+else
+	$group->access_id = 2;
+
 $group_profile_category = get_input('group_profile_category',null);
 if (isset($group_profile_category)) {
 	$group->group_profile_category = $group_profile_category;
 }
 
-$group->name = get_input('name','');
-$group->description = get_input('description','');
+$has_icon = isset($_FILES['icon']) && substr_count($_FILES['icon']['type'],'image/');
+
+$group->name = trim(get_input('name',''));
+$group->description = trim(get_input('description',''));
+$data = form_get_profile_data_from_form_post();
+
+$description_required = get_plugin_setting('description_required', 'flexgroupprofile');
+$image_required = get_plugin_setting('image_required', 'flexgroupprofile');
 
 // Validate create
-if (!$group->name)
+//TODO: rework to properly handle missing data by redisplaying form
+if (	(!$group->name)
+		|| (($description_required == 'yes') && !$group->description)
+		|| (($image_required == 'yes') && !$has_icon && !flexgroupprofile_group_icon_exists($group))
+)
 {
-	register_error(elgg_echo("groups:notitle"));
+	// need to redisplay the form
+	register_error(elgg_echo('flexgroupprofile:missing_error'));
+	if ($group_guid) {
+		set_page_owner($group_guid);
+		$title = elgg_echo("groups:edit");
+	} else {
+		$title = elgg_echo("groups:new");
+	}
 	
-	forward($_SERVER['HTTP_REFERER']);
+	set_context('groups');
+
+	$body = elgg_view_title($title);
+	
+	$body .= elgg_view("forms/groups/edit", 
+		array('entity' => $group, 'group_name'=>$group->name, 'description'=>$group->description, 
+		'group_guid'=>$group_guid, 'group_owner_username'=>$group_owner_username,
+		'membership'=>$membership, 'visibility'=>$visibility, 
+		'group_profile_category'=>$group_profile_category, 'data' => $data));
+	
+	$body = elgg_view_layout('two_column_left_sidebar', '', $body);
+	
+	page_draw($title, $body);
 	exit;
 }
 
 // Group membership
-switch (get_input('membership'))
+switch ($membership)
 {
 	case 2: $group->membership = ACCESS_PUBLIC; break;
 	default: $group->membership = ACCESS_PRIVATE; 
 }
 
-// Get access
-$group->access_id = ACCESS_PUBLIC;
-
 // Set group tool options
 if (isset($CONFIG->group_tool_options)) {
 	foreach($CONFIG->group_tool_options as $group_option) {
@@ -73,25 +115,60 @@ if (isset($CONFIG->group_tool_options)) {
 	}
 }	
 
-$data = form_get_profile_data_from_form_post();
-
-form_set_data($group,$data);
-
-$group->save();
-
-if (($group_owner_username = get_input('group_owner_username',''))
+if ($group_owner_username
 	&& ($user = get_user_by_username($group_owner_username) )) {
-		$new_group_owner_guid = $user->getGUID();
+		
+	$new_group_owner_guid = $user->getGUID();
+	if ($group->owner_guid) {
+		$old_group_owner_guid = $group->owner_guid;
+	} else {
+		$old_group_owner_guid = get_loggedin_userid();
+	}
+	
+	if ($new_group_owner_guid != $old_group_owner_guid) {
 		$group->owner_guid = $new_group_owner_guid;
 		$group->container_guid = $new_group_owner_guid;
+		if (!$has_icon) {
+			flexgroupprofile_move_group_icon($group->getGUID(),$old_group_owner_guid,$new_group_owner_guid);
+		}
+	}
+}
+
+if (!trigger_elgg_event('groupprofile_preupdate','group',array('entity'=>$group,'data'=>$data))) {
+	// need to redisplay the form, counting on whatever plugin stopped the save
+	// to set an appropriate message
+	if ($group_guid) {
+		set_page_owner($group_guid);
+		$title = elgg_echo("groups:edit");
+	} else {
+		$title = elgg_echo("groups:new");
+	}
+	
+	set_context('groups');
+
+	$body = elgg_view_title($title);
+	
+	$body .= elgg_view("forms/groups/edit", 
+		array('entity' => $group, 'group_name'=>$group->name, 'description'=>$group->description, 
+		'group_guid'=>$group_guid, 'group_owner_username'=>$group_owner_username,
+		'membership'=>$membership, 'visibility'=>$visibility, 
+		'group_profile_category'=>$group_profile_category, 'data' => $data));
+	
+	$body = elgg_view_layout('two_column_left_sidebar', '', $body);
+	
+	page_draw($title, $body);
+	exit;
 }
 
+$group->save();
+
 if (!$group->isMember($user))
-	$group->join($user); // Creator always a member
+	$group->join($user); // Owner is always a member
 
+form_set_data($group,$data);
 
 // Now see if we have a file icon
-if ((isset($_FILES['icon'])) && (substr_count($_FILES['icon']['type'],'image/')))
+if ($has_icon)
 {
 	$prefix = "groups/".$group->guid;
 	
@@ -109,6 +186,7 @@ if ((isset($_FILES['icon'])) && (substr_count($_FILES['icon']['type'],'image/'))
 	if ($thumbtiny) {
 		
 		$thumb = new ElggFile();
+		$thumb->owner_guid = $group->owner_guid;
 		$thumb->setMimeType('image/jpeg');
 		
 		$thumb->setFilename($prefix."tiny.jpg");
diff --git a/plugins/flexgroupprofile/languages/en.php b/plugins/flexgroupprofile/languages/en.php
index e391ca95ee086ec7d0b51552707bd3186ab53842..ebfa6e6d31426fef69c6a8872adb12360fb6ed23 100755
--- a/plugins/flexgroupprofile/languages/en.php
+++ b/plugins/flexgroupprofile/languages/en.php
@@ -4,6 +4,17 @@
 	
 	'flexgroupprofile:owner_label' => "Group owner",
 	'flexgroupprofile:owner_description' => "You can transfer group ownership by changing the above username to one for another user.",
+	'flexgroupprofile:settings:yes' => "Yes",
+	'flexgroupprofile:settings:no' => "No",
+	'flexgroupprofile:settings:membership:title' => "Group membership options",
+	'flexgroupprofile:settings:membership:open' => "Always open",
+	'flexgroupprofile:settings:membership:closed' => "Always closed",
+	'flexgroupprofile:settings:membership:set_per_group' => "Set per group",
+	'flexgroupprofile:settings:image_required:title' => "Mandatory group icon",
+	'flexgroupprofile:settings:description_required:title' => "Mandatory group description",
+	'flexgroupprofile:missing_error' => "You were missing required information. Please try again.",
+	'flexgroupprofile:new_group_description' => "Please enter the information below to create a new group.",
+	'flexgroupprofile:edit_group_description' => "You can change the information for this group below.",
 	);
 					
 	add_translation("en",$english);
diff --git a/plugins/flexgroupprofile/models/model.php b/plugins/flexgroupprofile/models/model.php
index b093978e05382ecd3f3b540b151f532dcaca02e8..d3d7799da886619bac3ede2e514683a5cefe8983 100755
--- a/plugins/flexgroupprofile/models/model.php
+++ b/plugins/flexgroupprofile/models/model.php
@@ -27,4 +27,74 @@ function flexgroupprofile_get_profile_config($group_profile_category) {
 	return $group_config;
 }
 
+function flexgroupprofile_get_configuration($group_profile_category,$tool_name) {
+	$md = array('tool_setting'=>$tool_name,'category'=>$group_profile_category);
+	$config = get_entities_from_metadata_multi($md,'object','group_configure');
+	if ($config) {
+		return $config[0]->tool_option;
+	}
+	
+	return false;
+}
+
+function flexgroupprofile_set_configuration($group_profile_category,$tool_name,$tool_option) {
+	$md = array('tool_setting'=>$tool_name,'category'=>$group_profile_category);
+	$config = get_entities_from_metadata_multi($md,'object','group_configure');
+	if ($config) {
+		$config = $config[0];
+		$config->tool_option = $tool_option;
+	} else {
+		$config = new ElggObject();
+		$config->subtype = 'group_configure';
+		$config->access_id = ACCESS_PUBLIC;
+		$config->tool_setting = $tool_name;
+		$config->category = $group_profile_category;
+		$config->tool_option = $tool_option;
+		$config->save();
+	}
+}
+
+function flexgroupprofile_move_group_icon($group_guid,$old_group_owner_guid,$new_group_owner_guid) {
+	
+	// get the group icon data and delete it on the file system
+	
+	$sizes = array('','tiny','small','medium','large');
+	
+	foreach ($sizes as $size) {
+		
+		$prefix = "groups/".$group_guid.$size;
+	
+		$filehandler = new ElggFile();
+		$filehandler->owner_guid = $old_group_owner_guid;
+		$filehandler->setFilename($prefix . ".jpg");
+		$filehandler->open("read");
+		$data = $filehandler->grabFile();
+		$filehandler->close();
+		$filehandler->delete();
+		
+		// save the group icon to the new location
+		
+		$filehandler = new ElggFile();
+		$filehandler->owner_guid = $new_group_owner_guid;
+		$filehandler->setFilename($prefix . ".jpg");
+		$filehandler->open("write");
+		$filehandler->write($data);
+		$filehandler->close();
+	}
+}
+
+function flexgroupprofile_group_icon_exists($group) {
+	$size = 'medium';
+	$filehandler = new ElggFile();
+	$filehandler->owner_guid = $group->owner_guid;
+	$filehandler->setFilename("groups/" . $group->guid . $size . ".jpg");
+
+	if ($filehandler->open("read")) {
+		if ($contents = $filehandler->read($filehandler->size())) {
+			return true;
+		} 
+	}
+	return false;
+}
+
 ?>
\ No newline at end of file
diff --git a/plugins/flexgroupprofile/start.php b/plugins/flexgroupprofile/start.php
index d64dbdc94c61ecb25e31d043e0e6f5d8ddbb1810..925d8882cb26d8869d4cf698f653ecad42788772 100755
--- a/plugins/flexgroupprofile/start.php
+++ b/plugins/flexgroupprofile/start.php
@@ -25,7 +25,7 @@ function flexgroupprofile_pagesetup() {
 	// Group submenu option	
 	if ($page_owner instanceof ElggGroup && get_context() == 'groups') {
 		$form = flexgroupprofile_get_profile_form($page_owner,$page_owner->group_profile_category);
-		if (!$form->profile_format || ($form->profile_format == 'default')) {
+		if ($form && (!$form->profile_format || ($form->profile_format == 'default'))) {
 			$title = friendly_title($page_owner->name);
 			add_submenu_item(elgg_echo('form:extended_profile_link_text'),$CONFIG->wwwroot.'pg/flexgroupprofile/'.$page_owner->getGUID().'/'.$title.'/','0extendedprofile');
 		}
diff --git a/plugins/flexgroupprofile/views/default/forms/groups/edit.php b/plugins/flexgroupprofile/views/default/forms/groups/edit.php
index 97ab79cbcf08832e4934fd17c6c0db0886ff91e7..1801ebe42350ab4c6790b7a15d4f8b6d06ac8e32 100755
--- a/plugins/flexgroupprofile/views/default/forms/groups/edit.php
+++ b/plugins/flexgroupprofile/views/default/forms/groups/edit.php
@@ -19,13 +19,68 @@ require_once(dirname(dirname(dirname(dirname(dirname(dirname(__FILE__)))))) . "/
 // Load flexgroupprofile model
 require_once(dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/models/model.php");
 
+//TODO - merge the profile config functions below with the new group_configure plugin
+
+// this ugly bit of checking is to handle a form resubmit
+// in case of error
+// TODO: do this better
+
 $group = $vars['entity'];
-$group_config = flexgroupprofile_get_profile_config($group->group_profile_category);
-if ($group) {
-	$group_profile_category = get_input('group_profile_category',$group->group_profile_category);
+if ($group instanceof ElggGroup) {
+	$group_owner_id = $group->getOwner();
 } else {
-	$group_profile_category = get_input('group_profile_category','');
+	$group_owner_id = 0;
 }
+if ($vars['group_name']) {
+	$group_name = $vars['group_name'];
+} else {
+	if ($group) {
+		$group_name = $group->name;
+	} else {
+		$group_name = '';
+	}
+}
+if ($vars['description']) {
+	$group_description = $vars['description'];
+} else {
+	if ($group) {
+		$group_description = $group->description;
+	} else {
+		$group_description = '';
+	}
+}
+if ($vars['group_guid']) {
+	$group_guid = $vars['group_guid'];
+} else {
+	if ($group) {
+		$group_guid = $group->guid;
+	} else {
+		$group_guid = 0;
+	}
+}
+
+if ($vars['group_profile_category']) {
+	$group_profile_category = $vars['group_profile_category'];
+} else {
+	if ($group) {
+		$group_profile_category = $group->group_profile_category;
+	} else {
+		$group_profile_category = null;
+	}
+}
+
+if ($vars['membership']) {
+	$membership = $vars['membership'];
+} else {
+	if ($group) {
+		$membership = $group->membership;
+	} else {
+		$membership = ACCESS_PUBLIC;
+	}
+}
+
+$group_config = flexgroupprofile_get_profile_config($group_profile_category);
+
 if ($group_profile_category) {
 	$fp = form_get_profile_config($group_profile_category,'group');
 } else {
@@ -33,11 +88,25 @@ if ($group_profile_category) {
 }
 ?>
 <div class="contentWrapper">
-<?php if ($fp && $fp->new_group_description) {echo $fp->new_group_description;} else { echo elgg_echo("form:new_group_description"); } ?>
+<?php 
+if (!$group) {
+	if ( $fp && trim($fp->new_group_description)) {
+		echo $fp->new_group_description;
+	} else { 
+		echo elgg_echo("flexgroupprofile:new_group_description");
+	}
+} else { 
+	if ($fp && trim($fp->edit_group_description)) {
+		echo $fp->edit_group_description; 
+	} else {
+		echo elgg_echo("flexgroupprofile:edit_group_description");
+	}
+} 
+?>
 </div>
 <div class="contentWrapper">
 <form action="<?php echo $vars['url']; ?>action/flexgroupprofile/edit" enctype="multipart/form-data" method="post">
-
+<?php echo elgg_view('input/securitytoken'); ?>
 	<p>
 		<label><?php if ($fp && $fp->group_icon) {echo $fp->group_icon;} else {echo elgg_echo("groups:icon");} ?><br />
 		<?php
@@ -53,7 +122,7 @@ if ($group_profile_category) {
 			<?php if ($fp && $fp->group_name) {echo $fp->group_name;} else { echo elgg_echo("groups:name"); } ?><br />
 			<?php echo elgg_view("input/text",array(
 															'internalname' => 'name',
-															'value' => $vars['entity']->name,
+															'value' => $group_name,
 															)); ?>
 		</label>
 	</p>
@@ -62,23 +131,27 @@ if ($group_profile_category) {
 			<?php if ($fp && $fp->group_description) {echo $fp->group_description;} else { echo elgg_echo("groups:description"); } ?><br />
 			<?php echo elgg_view("input/longtext",array(
 															'internalname' => 'description',
-															'value' => $vars['entity']->description,
+															'value' => $group_description,
 															)); ?>
 		</label>
 	</p>
 <?php
 	$form = flexgroupprofile_get_profile_form($group,$group_profile_category);
 	if ($form) {
-		$tab_data = form_get_data_for_profile_edit_form($form, $group, $group_profile_category);
+		$tab_data = form_get_data_for_profile_edit_form($form, $group, $group_profile_category,$vars['data']);
 		echo elgg_view('form/forms/display_form_content',array('tab_data'=>$tab_data,'description'=>'','preview'=>0,'form'=>$form,'form_data_id'=>0));
 	} else {
-		echo '<p>'.elgg_echo('form:error_no_group_profile_form').'</p>';
+		// it makes more sense to do nothing if there is no group profile form defined
+        // so commenting this out
+		//echo '<p>'.elgg_echo('form:error_no_group_profile_form').'</p>';
 	}
 	
-	if (isadminloggedin() || ($group_config->group_owner_can_transfer_ownership && ($group->getOwner() == $_SESSION['user']->getGUID()))) {
+	if (isadminloggedin() || ($group_config->group_owner_can_transfer_ownership && ($group_owner_id == get_loggedin_userid()))) {
 		// let admins or optionally group owners transfer ownership
-		if ($group) {
-			$group_owner_username = get_entity($group->getOwner())->username;
+		if ($vars['group_owner_username']) {
+			$group_owner_username = $vars['group_owner_username'];
+		} else if ($group_owner_id) {
+			$group_owner_username = get_entity($group_owner_id)->username;
 		} else {
 			$group_owner_username = get_loggedin_user()->username;
 		}
@@ -91,25 +164,81 @@ if ($group_profile_category) {
 		<p class="description"><?php echo elgg_echo('flexgroupprofile:owner_description');?></p>
 <?php
 }
+
+$flexgroupprofile_membership = get_plugin_setting('membership', 'flexgroupprofile');
+if ($flexgroupprofile_membership == 'open') {
+	echo elgg_view('input/hidden',array('internalname' => 'membership','value' => ACCESS_PUBLIC));
+} else if ($flexgroupprofile_membership == 'closed') {
+	echo elgg_view('input/hidden',array('internalname' => 'membership','value' => ACCESS_PRIVATE));
+} else {
  ?>
 
 	<p>
 		<label>
 			<?php echo elgg_echo('groups:membership'); ?><br />
-			<?php echo elgg_view('input/access', array('internalname' => 'membership','value' => $vars['entity']->membership, 'options' => array( ACCESS_PRIVATE => elgg_echo('groups:access:private'), ACCESS_PUBLIC => elgg_echo('groups:access:public')))); ?>
+			<?php echo elgg_view('input/access', array('internalname' => 'membership','value' => $membership, 'options' => array( ACCESS_PRIVATE => elgg_echo('groups:access:private'), ACCESS_PUBLIC => elgg_echo('groups:access:public')))); ?>
 		</label>
 	</p>
 	
+	<?php
+}
+	if (get_plugin_setting('hidden_groups', 'groups') == 'yes')
+	{
+?>
+
+	<p>
+		<label>
+			<?php echo elgg_echo('groups:visibility'); ?><br />
+			<?php 
+			
+			$this_owner = $vars['entity']->owner_guid;
+			if (!$this_owner) $this_owner = get_loggedin_userid();
+			
+			$access = array(ACCESS_FRIENDS => elgg_echo("access:friends:label"), 1 => elgg_echo("LOGGED_IN"), 2 => elgg_echo("PUBLIC"));
+			$collections = get_user_access_collections($this_owner);
+			if (is_array($collections))
+			{
+				foreach ($collections as $c)
+					$access[$c->id] = $c->name;
+			}
+			
+			echo elgg_view('input/access', array('internalname' => 'vis', 'value' =>  ($vars['entity']->access_id ? $vars['entity']->access_id : ACCESS_PUBLIC), 'options' => $access)); 
+			
+			
+			?>
+		</label>
+	</p>
+
+<?php 	
+	}
 	
+	?>
     <?php
 		if (isset($vars['config']->group_tool_options)) {
 			foreach($vars['config']->group_tool_options as $group_option) {
+				$group_option_default_value = '';
+				$tool_option = '';
 				$group_option_toggle_name = $group_option->name."_enable";
-				if ($group_option->default_on) {
-					$group_option_default_value = 'yes';
-				} else {
-					$group_option_default_value = 'no';
+				if ($group->group_profile_category) {
+					$tool_option = flexgroupprofile_get_configuration($group->group_profile_category,$group_option->name);
+					if ($tool_option == 'default') {
+						$group_option_default_value = 'yes';
+					} else if ($tool_option == 'no_default') {
+						$group_option_default_value = 'no';
+					}
 				}
+				if ($tool_option == 'exclude') {
+					echo elgg_view("input/hidden",array(
+									"internalname" => $group_option_toggle_name,
+									"value" => 'no'));
+				} else {
+					if (!$group_option_default_value) {
+						if ($group_option->default_on) {
+							$group_option_default_value = 'yes';
+						} else {
+							$group_option_default_value = 'no';
+						}
+					}				
 ?>	
     <p>
 			<label>
@@ -128,14 +257,15 @@ if ($group_profile_category) {
 			</label>
 	</p>
 	<?php
+				}
 		}
 	}
 	?>
 	<p>
 		<?php
-			if ($vars['entity'])
+			if ($group_guid)
 			{ 
-			?><input type="hidden" name="group_guid" value="<?php echo $vars['entity']->getGUID(); ?>" /><?php 
+			?><input type="hidden" name="group_guid" value="<?php echo $group_guid; ?>" /><?php 
 			}
 		?>
 		<input type="hidden" name="user_guid" value="<?php echo page_owner_entity()->guid; ?>" />
@@ -149,12 +279,13 @@ if ($group_profile_category) {
 <div class="contentWrapper">
 <div id="delete_group_option">
 	<form action="<?php echo $vars['url'] . "action/groups/delete"; ?>">
+	<?php echo elgg_view('input/securitytoken'); ?>
 		<?php
-			if ($vars['entity'])
+			if ($group_guid)
 			{ 
 				$warning = elgg_echo("groups:deletewarning");
 			?>
-			<input type="hidden" name="group_guid" value="<?php echo $vars['entity']->getGUID(); ?>" />
+			<input type="hidden" name="group_guid" value="<?php echo $group_guid; ?>" />
 			<input type="submit" name="delete" value="<?php echo elgg_echo('groups:delete'); ?>" onclick="javascript:return confirm('<?php echo $warning; ?>')"/><?php 
 			}
 		?>
diff --git a/plugins/flexgroupprofile/views/default/groups/groupprofile.php b/plugins/flexgroupprofile/views/default/groups/groupprofile.php
index cdaca21f516d376f5c568aa30ac500ea8d8e8cb5..1f11ac476a72d1830b6b9032663d476e621c0a35 100755
--- a/plugins/flexgroupprofile/views/default/groups/groupprofile.php
+++ b/plugins/flexgroupprofile/views/default/groups/groupprofile.php
@@ -87,6 +87,13 @@ require_once(dirname(dirname(dirname(dirname(__FILE__)))) . "/models/model.php")
 		    $body .= '<div class="contentWrapper">';
     		$body .= $vars['entity']->description;
     		$body .= '</div>';
+    		// allow plugins to add extra messages
+    		$msg = trim(trigger_plugin_hook('description','group',array('entity'=>$vars['entity'])));
+    		if ($msg) {
+    			$body .= '<div class="contentWrapper">';
+    			$body .= $msg;
+    			$body .= '</div>';
+    		}
         	if ($form) {
 				if (!in_array($form->profile_format,array('tabbed','wide_tabbed'))) {
 				    // a little bit weird, but actually in the default design 
@@ -111,7 +118,9 @@ require_once(dirname(dirname(dirname(dirname(__FILE__)))) . "/models/model.php")
 					$body .= '</div>';
 				}
         	} else {
-        		$body .= elgg_echo('form:error_no_group_profile_form');
+        		// it makes more sense to do nothing if there is no group profile form defined
+        		// so commenting this out
+        		//$body .= elgg_echo('form:error_no_group_profile_form');
         	}
         	echo $body;
 		}
@@ -125,9 +134,25 @@ if ($form->profile_format == 'wide_tabbed') {
 	echo elgg_view('flexgroupprofile/extended',array('entity'=>$vars['entity'],'embedded'=>true));
 	echo '</div>';
 }
-?>
 
-	<p class="groups_info_edit_buttons">
+if ($vars['full'] == true) {
+    if ($form) {
+    	if (!in_array($form->profile_format,array('tabbed','wide_tabbed'))) {
+		    // do bottom
+		    if ($data['bottom']) {
+		    	echo '<div style="float:left;">';
+			    foreach($data['bottom'] as $item) {	
+			    	echo '<b>'.$item->title.'</b>';
+			    	echo '<br />'.trim($item->value);
+			    }
+			    echo "</div>";
+		    }
+    	}
+    }
+}
+?>
+<br clear="both" />
+<p class="groups_info_edit_buttons">
 	
 <?php
 	if ($vars['entity']->canEdit()) 
@@ -138,25 +163,8 @@ if ($form->profile_format == 'wide_tabbed') {
 		<a href="<?php echo $vars['url']; ?>mod/groups/edit.php?group_guid=<?php echo $vars['entity']->getGUID(); ?>"><?php echo elgg_echo("edit"); ?></a>
 		
 			
+	</p>
 <?php
-	
-	}
-
-    if ($vars['full'] == true) {
-    	if ($form) {
-	    	if (!in_array($form->profile_format,array('tabbed','wide_tabbed'))) {
-			    // do bottom
-			    if ($data['bottom']) {
-				    foreach($data['bottom'] as $item) {	
-				    	echo '<b>'.$item->title.'</b>';
-				    	echo '<br /><br />';
-				    	echo $item->value;
-				    }
-			    }
-	    	}
-    	}
 	}
 ?>
-	
-	</p>
 </div>
\ No newline at end of file
diff --git a/plugins/flexgroupprofile/views/default/settings/flexgroupprofile/edit.php b/plugins/flexgroupprofile/views/default/settings/flexgroupprofile/edit.php
new file mode 100644
index 0000000000000000000000000000000000000000..44d161ef7fee49f5d92741849ddefeea9814c2a8
--- /dev/null
+++ b/plugins/flexgroupprofile/views/default/settings/flexgroupprofile/edit.php
@@ -0,0 +1,45 @@
+<?php
+$yn_options = array(elgg_echo('flexgroupprofile:settings:yes')=>'yes',
+	elgg_echo('flexgroupprofile:settings:no')=>'no',
+);
+
+$membership_options = array(elgg_echo('flexgroupprofile:settings:membership:open')=>'open',
+	elgg_echo('flexgroupprofile:settings:membership:closed')=>'closed',
+	elgg_echo('flexgroupprofile:settings:membership:set_per_group')=>'set_per_group',
+);
+
+$body = '';
+
+$flexgroupprofile_membership = get_plugin_setting('membership', 'flexgroupprofile');
+if (!$flexgroupprofile_membership) {
+	$flexgroupprofile_membership = 'set_per_group';
+}
+
+$body .= elgg_echo('flexgroupprofile:settings:membership:title');
+$body .= '<br />';
+$body .= elgg_view('input/radio',array('internalname'=>'params[membership]','value'=>$flexgroupprofile_membership,'options'=>$membership_options));
+
+$body .= '<br />';
+
+$flexgroupprofile_image_required = get_plugin_setting('image_required', 'flexgroupprofile');
+if (!$flexgroupprofile_image_required) {
+	$flexgroupprofile_image_required = 'no';
+}
+
+$body .= elgg_echo('flexgroupprofile:settings:image_required:title');
+$body .= '<br />';
+$body .= elgg_view('input/radio',array('internalname'=>'params[image_required]','value'=>$flexgroupprofile_image_required,'options'=>$yn_options));
+
+$body .= '<br />';
+
+$flexgroupprofile_description_required = get_plugin_setting('description_required', 'flexgroupprofile');
+if (!$flexgroupprofile_description_required) {
+	$flexgroupprofile_description_required = 'no';
+}
+
+$body .= elgg_echo('flexgroupprofile:settings:description_required:title');
+$body .= '<br />';
+$body .= elgg_view('input/radio',array('internalname'=>'params[description_required]','value'=>$flexgroupprofile_description_required,'options'=>$yn_options));
+
+echo $body;
+?>
\ No newline at end of file
diff --git a/plugins/flexprofile/.project b/plugins/flexprofile/.project
new file mode 100644
index 0000000000000000000000000000000000000000..5ddd61dbeb42fd80e6f30146d654517f32d1fa39
--- /dev/null
+++ b/plugins/flexprofile/.project
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>flexprofile</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.php.core.PhpIncrementalProjectBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.php.core.ValidationManagerWrapper</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.php.core.PHPNature</nature>
+	</natures>
+</projectDescription>
diff --git a/plugins/flexprofile/README.txt b/plugins/flexprofile/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9a4201909dcba18dbf8aacfb434efceef509c743
--- /dev/null
+++ b/plugins/flexprofile/README.txt
@@ -0,0 +1,67 @@
+/**
+ * Use form module to manage profile questions through the web
+ * 
+ * @package flexprofile
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Kevin Jardine <kevin@radagast.biz>
+ * @copyright Radagast Solutions 2008
+ * @link http://radagast.biz/
+ * 
+ */
+ 
+The Elgg 1.x flexprofile plugin requires the form plugin.
+
+Do not activate the flexprofile plugin without creating a profile form first -
+if you do, your profiles will be blank and there will be nothing to edit
+as no profile questions will be defined.
+
+You can use the "Add form" link on the Manage forms page provided by 
+the form module to manage your profile questions through the web. Specify a
+"user profile" form when creating your form.
+
+Field type restrictions
+
+Currently the invitation box field type does not work for
+profile forms.
+
+It is also not possible to make profile fields required.
+
+Some of these restrictions may be removed eventually.
+
+For profile forms, there are a few extra profile field definition options.
+
+You can specify whether the profile field should be displayed in the profile
+summary area on the left, right or bottom area of the profile (or not at all). 
+By default they are displayed on the right. Even if the field cannot be viewed
+in the profile summary area, it can still be viewed in the extended profile
+if the user has the correct permissions and you have activated the extended
+profile option (see below).
+
+You can also specify whether a profile field is invisible. This is a value that
+can be edited by the user but is never displayed.
+
+You can specify the profile format. Currently there are three formats. The
+default format is similar to the standard Elgg 1.1 summary profile with the
+addition of an extended profile (accessed by a link) that shows all the visible
+fields (separated by tabs if more than one tab was specified). The default 
+format (no extended profile) does not include the link to the extended profile.
+The tabbed format shows just the tabbed extended profile and no summary
+profile.
+
+You can also specify different user profiles for different user categories.
+There is currently no way to set user categories, however, so this feature
+is for future use.
+
+Activating the flexprofile plugin
+
+Create a profile form as described above. More documentation on creating forms
+is contained in the form plugin README.txt.
+
+Then extract the flexprofile plugin into the mod directory and activate it as
+usual using the Elgg 1.x tool administration.
+
+Once activated, the edit details link should show the fields that you have
+defined for your profile form.
+
+You can have multiple profile forms defined, but the flexprofile plugin will
+always use the one most recently created.
diff --git a/plugins/flexprofile/actions/edit.php b/plugins/flexprofile/actions/edit.php
new file mode 100644
index 0000000000000000000000000000000000000000..c68a351d0493b34d36432b16772716743be655e9
--- /dev/null
+++ b/plugins/flexprofile/actions/edit.php
@@ -0,0 +1,51 @@
+<?php
+/**
+	 * Elgg flex profile edit action
+	 * Allows user to edit profile
+	 * 
+	 * @package Elgg
+	 * @subpackage Form
+	 * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+	 * @author Kevin Jardine <kevin@radagast.biz>
+	 * @copyright Radagast Solutions 2008
+	 * @link http://radagast.biz/
+	 */
+
+	 // Load flexprofile model
+require_once(dirname(dirname(__FILE__)) . "/models/model.php");
+
+if ($user = page_owner()) {
+	$user = page_owner_entity();			
+} else {
+	$user = $_SESSION['user'];
+	set_page_owner($user->getGUID());
+}
+
+if ($user && $user->canEdit()) {
+    $data = form_get_profile_data_from_form_post();
+    // Notify of profile pre-update
+	if (trigger_elgg_event('profilepreupdate','user',array('entity'=>$user,'data'=>$data))) {
+		//TODO: add validation here and if it fails, redisplay form
+	    form_set_data($user,$data);
+	    // Notify of profile update
+		trigger_elgg_event('profileupdate',$user->type,$user);
+		//add to river
+		add_to_river('river/user/default/profileupdate','update',$user->guid,$user->guid);
+		
+		system_message(elgg_echo("profile:saved"));
+	} else {
+		register_error(elgg_echo("profile:cantedit"));
+		//TODO: this is also where we could redisplay the profile edit form
+	}
+
+	// Forward to the user's profile
+	forward($user->getUrl());
+
+} else {
+    // If we can't, display an error
+	
+	register_error(elgg_echo("profile:cantedit"));
+	forward();
+}
+
+?>
\ No newline at end of file
diff --git a/plugins/flexprofile/extended.php b/plugins/flexprofile/extended.php
new file mode 100644
index 0000000000000000000000000000000000000000..66ca0d16f4fd21089f78251cdb462e70f29c87c2
--- /dev/null
+++ b/plugins/flexprofile/extended.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * Elgg flexprofile extended profile
+ * 
+ * @package FlexProfile
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Kevin Jardine <kevin@radagast.biz>
+ * @copyright Radagast Solutions 2008
+ * @link http://radagast.biz/
+ */
+ 
+// Load Elgg engine
+require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php");
+
+global $CONFIG;
+
+// Define context
+set_context('profile');
+
+$user = page_owner_entity();
+
+add_submenu_item(elgg_echo('form:extended_profile_link_text'),$CONFIG->wwwroot.'pg/flexprofile/'.$user->username);
+add_submenu_item(elgg_echo('form:main_profile_link_text'),$user->getUrl());
+
+$body = elgg_view('flexprofile/extended',array('entity'=>$user));
+
+$title = sprintf(elgg_echo('form:extended_profile_title'),$user->name);
+
+page_draw($title,elgg_view_layout("two_column_left_sidebar", '', elgg_view_title($title) . $body));
+
+?>
\ No newline at end of file
diff --git a/plugins/flexprofile/manifest.xml b/plugins/flexprofile/manifest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b673ac5c792f5add381495425b17d7ce5245ca92
--- /dev/null
+++ b/plugins/flexprofile/manifest.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest>
+        <field key="author" value="Kevin Jardine &lt;kevin@radagast.biz&gt;" />
+        <field key="version" value="0.8" />
+        <field key="description" value="Elgg flexible user profile plugin." />
+        <field key="website" value="http://radagast.biz/" />
+        <field key="copyright" value="(C) Radagast Solutions 2009" />
+		<field key="licence" value="GNU Public License version 2" />
+		<field key="elgg_version" value="2009030101" />
+</plugin_manifest>
diff --git a/plugins/flexprofile/models/model.php b/plugins/flexprofile/models/model.php
new file mode 100644
index 0000000000000000000000000000000000000000..93d52fd03f40c9462bdada7bfc24e05ecd14f757
--- /dev/null
+++ b/plugins/flexprofile/models/model.php
@@ -0,0 +1,147 @@
+<?php
+/**
+	 * Elgg flex profile model
+	 * Functions to save and display profile data
+	 * 
+	 * @package Elgg
+	 * @subpackage Form
+	 * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+	 * @author Kevin Jardine <kevin@radagast.biz>
+	 * @copyright Radagast Solutions 2008
+	 * @link http://radagast.biz/
+	 */
+
+// Load form model
+require_once(dirname(dirname(dirname(__FILE__))) . "/form/models/model.php");
+
+// Load form profile model
+require_once(dirname(dirname(dirname(__FILE__))) . "/form/models/profile.php");
+
+// Eventually this will be very flexible and return different forms for
+// different entities.
+// Right now it just returns the first public profile form available.
+
+function flexprofile_get_profile_form($user=null) {
+    return form_get_latest_public_profile_form(1);
+}    
+
+// use the specified profile form to return the data (indexed by summary area) from the specified user
+
+function flexprofile_get_data_for_summary_display($form, $user) {
+    $form_id = $form->getGUID();
+    $data = form_get_data_from_profile($form_id,$user);
+    $area_data = array();
+    $maps = form_get_maps($form_id);
+    if ($maps) {
+        foreach($maps as $map) {
+            $field = get_entity($map->field_id);
+            //print($field->internal_name.','.$field->field_type.','.$field->choice_type.','.$field->default_value.'<br />');
+            $internalname = $field->internal_name;
+            if (isset($data[$internalname]) && $data[$internalname]->value) {
+                $area = $field->area;
+                if ($area) {
+                    if (!isset($area_data[$area])) {
+                        $area_data[$area] = array();
+                    }
+                    $item = new StdClass();
+                    $item->internalname = $internalname;
+                    $item->title = form_field_t($form,$field,'title');
+                    $item->description = form_field_t($form,$field,'description');
+                    if ($field->field_type == 'choices') {
+                        $item->fieldtype = $field->choice_type;
+                        $choices = form_get_field_choices($field->getGUID());
+                        $this_choice = '';
+                        foreach($choices as $choice) {
+                            if ($choice->value == $data[$internalname]->value) {
+                                $this_choice = $choice;
+                                break;
+                            }
+                        }
+                        $item->value = form_choice_t($form,$field,$this_choice);
+                    } else {
+                        $item->fieldtype = $field->field_type;
+                        $item->value = $data[$internalname]->value;
+                    }
+                    
+                    $area_data[$area][] = $item;
+                }
+            }
+        }
+    }
+    return $area_data;
+}
+    
+
+// Return the form fields (indexed by tab), optionally prepopulated with data from the specified user.
+
+function flexprofile_get_data_for_edit_form($form, $user=null) {
+
+    if ($user) {
+        $data = form_get_data_from_profile($form->getGUID(),$user);
+    } else {
+        $data = array();
+    }
+    
+    $tab_data = array();
+    $form_tabs = form_display_by_tab($form,$data);
+
+    $tabs = $form_tabs['main'];
+    
+    // add access control pulldowns
+    if ($tabs) {
+        foreach ($tabs as $tab => $tab_items) {
+            $tab_data[$tab] = '';
+            foreach ($tab_items as $item) {            	
+            	//TODO - remove access controls for invisible fields
+                $internalname = $item->internalname;
+                // add access dropdown unless the item is invisible
+                if (!$item->invisible) {
+	                $access_id = $item->default_access;
+	                
+	                $access_bit = '<p class="form-field-access">';
+	                $access_bit .= elgg_view('input/access', array('internalname' => 'flexprofile_access['.$internalname.']','value'=>$access_id));
+	                $access_bit .= '</p>';
+                } else {
+                	$access_bit = elgg_view('input/hidden', array('internalname' => 'flexprofile_access['.$internalname.']','value'=>ACCESS_PRIVATE));
+                }
+                $tab_data[$tab] .= $item->html.$access_bit;
+            }
+        }
+    }
+    
+    // currently $form_tabs['extra'] is only used for hidden fields, so don't add
+    // access fields
+    
+    $tabs = $form_tabs['extra'];
+    $extra = '';
+    foreach ($tabs as $item) {
+    	$extra .= $item->html;
+    }
+    
+    return array('main'=>$tab_data,'extra'=>$extra);
+}
+    
+function flexprofile_set_data($entity,$data) {
+    global $CONFIG;
+    
+    $entity_guid = $entity->getGUID();
+    
+    foreach($data as $name => $item) {
+    	remove_metadata($entity_guid, $name);
+    	$value = $item->value;
+    	if (is_array($value)) {
+    		// currently tags are the only field_type returning multiple values
+			$i = 0;
+			foreach($value as $interval) {
+				$i++;
+				if ($i == 1) { $multiple = false; } else { $multiple = true; }
+				create_metadata($entity_guid, $name, $interval, 'text', $entity_guid, $item->access_id, $multiple);
+			}
+		} else {
+    		create_metadata($entity_guid, $name, $value, '', $entity_guid, $item->access_id);
+		}
+    }
+}
+
+
+?>
\ No newline at end of file
diff --git a/plugins/flexprofile/start.php b/plugins/flexprofile/start.php
new file mode 100644
index 0000000000000000000000000000000000000000..88696224a01adfc57e77478bda541edafdb022ee
--- /dev/null
+++ b/plugins/flexprofile/start.php
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * Elgg flexprofile plugin
+ * 
+ * @package FlexProfile
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Kevin Jardine <kevin@radagast.biz>
+ * @copyright Radagast Solutions 2008
+ * @link http://radagast.biz/
+ */
+
+
+// Load flexprofile model
+    require_once(dirname(__FILE__)."/models/model.php");
+    
+/**
+ * Profile init function; sets up the profile functions
+ *
+ */
+	function flexprofile_init() {
+
+		// override profile views
+		// commented out as it is redundant
+		//set_view_location("profile/userdetails", dirname(__FILE__).'/views/');
+		//set_view_location("profile/edit", dirname(__FILE__).'/views/');
+		
+		// Register a page handler, so we can have nice URLs
+		register_page_handler('flexprofile','flexprofile_page_handler');
+	}
+	
+	function flexprofile_pagesetup() {
+		global $CONFIG;
+		
+		if (get_context() == 'profile') {
+			$form = flexprofile_get_profile_form();
+			if (!$form->profile_format || ($form->profile_format == 'default')) {		
+				extend_view("profile/menu/actions","flexprofile/menu/actions");
+			}
+		}
+	}
+	
+	/* Flexprofile page handler; allows the use of fancy URLs
+	 *
+	 * @param array $page From the page_handler function
+	 * @return true|false Depending on success
+	 */
+	function flexprofile_page_handler($page) {
+		
+		// The first component of a flexprofile URL is the username
+		if (isset($page[0])) {
+			set_input('username',$page[0]);
+		}
+		
+		@include(dirname(__FILE__) . "/extended.php");
+		return true;
+		
+	}
+
+	register_elgg_event_handler('pagesetup','system','flexprofile_pagesetup');
+	
+// Make sure the profile initialisation function is called on initialisation
+	register_elgg_event_handler('init','system','flexprofile_init',2);
+	
+// Register actions
+	global $CONFIG;
+	register_action("flexprofile/edit",false,$CONFIG->pluginspath . "flexprofile/actions/edit.php");
+
+?>
\ No newline at end of file
diff --git a/plugins/flexprofile/views/default/flexprofile/extended.php b/plugins/flexprofile/views/default/flexprofile/extended.php
new file mode 100644
index 0000000000000000000000000000000000000000..f40932be638feb45484dfae0503e053b2ac9ae78
--- /dev/null
+++ b/plugins/flexprofile/views/default/flexprofile/extended.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Extended profile view
+ *
+ * @package Flexprofile
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Kevin Jardine <kevin@radagast.biz>
+ * @copyright Radagast Solutions 2008
+ * @link http://radagast.biz/
+ */
+
+// Load flexprofile model
+require_once(dirname(dirname(dirname(dirname(__FILE__)))) . "/models/model.php");
+
+$user = $vars['entity'];
+$form = flexprofile_get_profile_form($user);
+if (!$vars['embedded']) {
+	echo '<div class="contentWrapper">';
+}
+if ($form) {
+	$tab_data = form_get_data_for_profile_tabbed_display($form, $user);
+
+	echo elgg_view('form/forms/display_form_content',array('tab_data'=>$tab_data,'description'=>'','preview'=>0,'form'=>$form,'form_data_id'=>0,'embedded'=>$vars['embedded']));
+} else {
+	echo elgg_echo('form:error_no_profile_form');
+}
+if (!$vars['embedded']) {
+	echo '</div>';
+}
diff --git a/plugins/flexprofile/views/default/flexprofile/menu/actions.php b/plugins/flexprofile/views/default/flexprofile/menu/actions.php
new file mode 100644
index 0000000000000000000000000000000000000000..f628c907811424fb30a3197fe4f32aaa42c314c2
--- /dev/null
+++ b/plugins/flexprofile/views/default/flexprofile/menu/actions.php
@@ -0,0 +1,3 @@
+<?php
+	echo "<p><a href=\"{$vars['url']}pg/flexprofile/{$vars['entity']->username}\">" . elgg_echo("form:extended_profile_link_text") . "</a></p>";
+?>
\ No newline at end of file
diff --git a/plugins/flexprofile/views/default/profile/edit.php b/plugins/flexprofile/views/default/profile/edit.php
new file mode 100644
index 0000000000000000000000000000000000000000..be9a146bae6f625aba1177e5f9850c237087f4d2
--- /dev/null
+++ b/plugins/flexprofile/views/default/profile/edit.php
@@ -0,0 +1,41 @@
+<?php
+/**
+	 * Elgg flex profile edit form
+	 * Allows user to edit profile
+	 * 
+	 * @package Elgg
+	 * @subpackage Form
+	 * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+	 * @author Kevin Jardine <kevin@radagast.biz>
+	 * @copyright Radagast Solutions 2008
+	 * @link http://radagast.biz/
+	 */
+
+	 // Load flexprofile model
+require_once(dirname(dirname(dirname(dirname(__FILE__)))) . "/models/model.php");
+
+$user = $vars['entity'];
+$form = flexprofile_get_profile_form($user);
+if ($form) {
+	$tab_data = flexprofile_get_data_for_edit_form($form, $user);
+
+echo '<div class="contentWrapper">';
+echo '<form action="'.$vars['url'].'action/flexprofile/edit" method="post" enctype="multipart/form-data">';
+echo elgg_view('input/securitytoken');
+echo elgg_view('form/forms/display_form_content',array('tab_data'=>$tab_data,'description'=>'','preview'=>0,'form'=>$form,'form_data_id'=>0));
+
+?>
+
+	<p>
+		<input type="hidden" name="username" value="<?php echo page_owner_entity()->username; ?>" />
+		<input type="submit" class="submit_button" value="<?php echo elgg_echo("save"); ?>" />
+	</p>
+
+<?php
+echo '</form>';
+} else {
+	echo elgg_echo('form:error_no_profile_form');
+}
+echo '</div>';
+
+?>
\ No newline at end of file
diff --git a/plugins/flexprofile/views/default/profile/userdetails.php b/plugins/flexprofile/views/default/profile/userdetails.php
new file mode 100644
index 0000000000000000000000000000000000000000..e802191e7e256f14d68e66081dd9f064c56ae8dd
--- /dev/null
+++ b/plugins/flexprofile/views/default/profile/userdetails.php
@@ -0,0 +1,184 @@
+<?php
+
+	/**
+	 * Elgg user display (details)
+	 * 
+	 * @package ElggProfile
+	 * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+	 * @author Curverider Ltd <info@elgg.com>
+	 * @copyright Curverider Ltd 2008
+	 * @link http://elgg.com/
+	 * 
+	 * @uses $vars['entity'] The user entity
+	 */
+
+// Load flexprofile model
+require_once(dirname(dirname(dirname(dirname(__FILE__)))) . "/models/model.php");
+
+// Load form profile model
+require_once(dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/form/models/profile.php");
+
+if ($vars['full'] == true) {
+	$iconsize = "large";
+} else {
+	$iconsize = "medium";
+}
+
+// wrap all profile info
+echo "<div id=\"profile_info\">";
+
+?>
+
+<table cellspacing="0">
+<tr>
+<td>
+
+<?php	
+	
+	// wrap the icon and links in a div
+	echo "<div id=\"profile_info_column_left\">";
+	
+	echo "<div id=\"profile_icon_wrapper\">";
+	// get the user's main profile picture
+	echo elgg_view(
+						"profile/icon", array(
+												'entity' => $vars['entity'],
+												//'align' => "left",
+												'size' => $iconsize,
+												'override' => true,
+											  )
+					);
+
+
+    echo "</div>";
+    echo "<div class=\"clearfloat\"></div>";
+     // display relevant links			
+    echo elgg_view("profile/profilelinks", array("entity" => $vars['entity']));
+       
+    // close profile_info_column_left
+    
+    if ($vars['full'] == true) {
+
+        $form = flexprofile_get_profile_form($vars['entity']);
+  		if ($form) {
+	        if ($form->profile_format !== 'tabbed') {
+	        	$body = '';
+		        $data = form_get_data_for_profile_summary_display($form, $vars['entity']);
+		        // do left column
+				if ($data['left']) {
+					foreach($data['left'] as $item) {
+						$value = $item->value;
+						if (!empty($value)) {
+							
+						//This function controls the alternating class
+		                $even_odd = ( 'odd' != $even_odd ) ? 'odd' : 'even';
+			            $body .= "<p class=\"{$even_odd}\"><b>";	
+					    $body .= $item->title.':</b> ';	
+					    $body .= $item->value;
+				
+						}
+					}
+				}
+				print $body;
+	        }
+		}
+    }
+	
+    echo "</div>";
+
+?>
+</td>
+<td>
+	
+	<div id="profile_info_column_middle" >
+<?php
+    $editdetails = elgg_echo("profile:edit");
+    $body = '';
+	if ($vars['entity']->canEdit()) {
+        $body .= <<<END
+	<p class="profile_info_edit_buttons">
+		<a href="{$vars['url']}mod/profile/edit.php?username={$vars['entity']->username}">
+		$editdetails</a>
+	</p>
+END;
+
+	}
+	// Simple XFN
+	$rel = "";
+	if (page_owner() == $vars['entity']->guid)
+		$rel = 'me';
+	else if (check_entity_relationship(page_owner(), 'friend', $vars['entity']->guid))
+		$rel = 'friend';
+		
+	// display the users name
+	$body .= "<h2><a href=\"" . $vars['entity']->getUrl() . "\" rel=\"$rel\">" . $vars['entity']->name . "</a></h2>";
+
+	//insert a view that can be extended
+	$body .= elgg_view("profile/status", array("entity" => $vars['entity']));
+	// display the users name
+	//$body .= "<h2><a href=\"" . $vars['entity']->getUrl() . "\">" . $vars['entity']->name . "</a></h2>";
+
+	if ($vars['full'] == true) {
+		if ($form) {
+			if ($form->profile_format != 'tabbed') {		
+		        // do right column
+				if ($data['right']) {
+					foreach($data['right'] as $item) {
+						$value = $item->value;
+						if (!empty($value)) {
+							
+						//This function controls the alternating class
+		                $even_odd = ( 'odd' != $even_odd ) ? 'odd' : 'even';
+			            $body .= "<p class=\"{$even_odd}\"><b>";	
+					    $body .= $item->title.':</b> ';	
+					    $body .= $item->value;
+				
+						}
+					}
+				}
+			} else {
+				$body .= elgg_view('flexprofile/extended',array('entity'=>$vars['entity'],'embedded'=>true));
+			}
+		} else {
+			$body .= elgg_echo('form:error_no_profile_form');
+		}
+	}
+	
+	echo $body;
+			
+        
+	
+	?>
+	</div><!-- /#profile_info_column_middle -->
+
+</td>
+</tr>
+
+<tr>
+<td colspan="2">
+	<?php
+	if ($form) {
+		if ($form->profile_format != 'tabbed') {
+			if ($data['bottom']) {
+				echo '<div id="profile_info_column_right">';
+		    	foreach($data['bottom'] as $item) {		
+		    		echo '<b>'.$item->title.'</b>';
+		    		echo '<br /><br />';
+		    		echo $item->value;
+		    		echo '<br />';
+		        }
+		        echo '</div><!-- /#profile_info_column_right -->';
+		    }
+		}
+	}
+    ?>
+
+</td>
+</tr>
+
+
+</table>
+
+
+
+</div><!-- /#profile_info -->
\ No newline at end of file
diff --git a/plugins/flexreg/README.txt b/plugins/flexreg/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..056eba287d5e2b7c36f344fcafa0d5c2c2ba727c
--- /dev/null
+++ b/plugins/flexreg/README.txt
@@ -0,0 +1,134 @@
+/**
+ * Manage registration form
+ * 
+ * @package flexreg
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Kevin Jardine <kevin@radagast.biz>
+ * @copyright Radagast Solutions 2010
+ * @link http://radagast.biz/
+ * 
+ */
+ 
+ The flexreg plugin replaces the standard Elgg registration system with one 
+ that works with the form and flexprofile plugins. You must have both the
+ form and flexprofile plugins activated and above flexreg in plugin sequence
+ in order to use it.
+ 
+ If you have already used the form and flexprofile plugins to create a profile
+ form, you can then create a related registration form.
+ 
+ You can add fields to the registration form by using the "Existing field name"
+ form in the "Add field" section when managing your registration form.
+ 
+ These registration fields will then be added to the standard Elgg registration 
+ fields (eg. email and password). The form description will also be added to
+ the registration page if you choose to provide one.
+ 
+ You can optionally provide a template for your registration form to allow
+ a more elaborate design than is supported by the standard display. The
+ templating language is described below.
+ 
+ You can also specify that certain registration fields are required. If a user
+ fails to provide values for these fields, the registration form will be
+ redisplayed with a message explaining that these fields are required.
+ 
+ (Note that required fields are only enforced on the registration form 
+ currently, not on the user profile form, so that users will be able to delete 
+ information which they provide at registration time.)
+ 
+ Flexreg provides a number of additional features: registration moderation, 
+ automatic groups, optional groups, automatic generation of user names from 
+ display names (useful if your users  login using their email addresses and 
+ don't care what their usernames are) and replacing the display name field on 
+ the registration form with separate first name and last name fields.
+ 
+ You can activate these features in the flexreg plugin area.
+ 
+ More detailed descriptions of these features follow.
+ 
+ *Registration moderation*
+ 
+ If enabled, registrants are asked to confirm their email addresses and then
+ are told that their account application has been submitted for approval by
+ a moderator. A link is added to the left column in the admin area for
+ reviewing the registration provided and either approving or rejecting these 
+ applications. In the flexreg plugin settings you can optionally set an email
+ address to alert a moderator to new account applications, as well as a
+ detailed standard welcome message to be sent to approved users to orient them
+ to your site.
+ 
+ *Automatic groups*
+ 
+ You can automatically sign users up to groups when they register by specifying
+ their guids in the automatic groups box in the flexreg plugin settings.
+ 
+ *Optional groups*
+ 
+ You can add a checkbox list of optional groups to your register by specifying
+ their guids in the optional groups box in the flexreg plugin settings. Users
+ will be signed up to the groups they select.
+ 
+ *Automatic generation of user names*
+ 
+ Only use this if your users do not use their usernames to login.
+ 
+ *First name and last name*
+ 
+ The display name is constructed automatically by concatenating these
+ fields with a space in between. Useful for a professional site that 
+wants to encourage people to use their real names.
+
+*Registration form templates*
+
+The standard Elgg registration form is a bit plain, and you may want to
+have a more elaborate layout, especially if you have a number of questions.
+
+You can specify a full blown XHTML template when managing your registration
+form by entering it in the Templates section.
+
+If you have a field called "profile_field", you can then display its
+associated values in the following way:
+
+{$profile_field:t}
+
+The title of your field.
+
+{$profile_field:d}
+
+The description of your field.
+
+{$profile_field:i}
+
+The input element of your field (text box, pulldown, etc.)
+
+As with other form plugin templates, you also embed your own text or use
+
+{@string_handle}
+
+in your template to embed the text that would be produced by
+
+elgg_echo('string_handle')
+
+There are seven special fields:
+
+_name
+_email
+_username
+_password
+_password2
+_first_name
+_last_name
+
+You can access them in exactly the same way as your profile fields and the
+standard text and form elements will be displayed.
+
+You need to have activated the first name, last name feature to use the last
+two special fields.
+
+If you are creating a registration form template, don't forget to include
+required fields (like _email, _password and _password2) or the registration will
+always fail.
+ 
+ 
+ 
+ 
\ No newline at end of file
diff --git a/plugins/flexreg/actions/confirm.php b/plugins/flexreg/actions/confirm.php
new file mode 100644
index 0000000000000000000000000000000000000000..94cb9d91585d2fe8ae8a9794d956f5ba1cb8e895
--- /dev/null
+++ b/plugins/flexreg/actions/confirm.php
@@ -0,0 +1,63 @@
+<?php
+	/**
+	 * Action which confirms an email when it is registered or changed, based on a code.
+	 * Modified from the version in uservalidationbyemail
+	 * 
+	 * @package Elgg
+	 * @subpackage Core
+	 * @author 
+	 * @link http://elgg.org/
+	 */
+
+	// Load flexreg model
+    require_once(dirname(dirname(__FILE__))."/models/model.php");
+
+	global $CONFIG;
+	
+	$flexreg_moderation = get_plugin_setting('moderation', 'flexreg');
+
+	// Get user id
+	$access_status = access_get_show_hidden_status();
+	access_show_hidden_entities(true);
+	
+	$user_guid = (int)get_input('u');
+	$user = get_entity($user_guid);
+	
+	// And the code
+	$code = sanitise_string(get_input('c'));
+	
+	if ( ($code) && ($user) ) {
+		if ($code == uservalidationbyemail_generate_code($user_guid, $user->email)) {
+			if (!$user->isEnabled() && ($flexreg_moderation == 'yes')) {
+				// the user is disabled, so presumably this is an inital
+				// email address confirmation during registration
+				// the moderation code currently has an ugly permissions work around, 
+				// so safe to validate now
+				// TODO: find a better way
+				set_user_validation_status($user_guid, true, 'email');
+				flexreg_notify($user->name.' ('.$user->username.')');
+				system_message(elgg_echo('flexreg:email:confirm:success'));
+			} else {
+				system_message(elgg_echo('email:confirm:success'));
+				$notify_subject = sprintf(elgg_echo('email:validate:success:subject'), $user->username);
+				$notify_message = sprintf(elgg_echo('email:validate:success:body'), $user->name);
+				// enable before validation
+				$user->enable();
+				// TODO: this validate bit may not work because of permissions problems
+				// does it matter given that they are activated?
+				set_user_validation_status($user_guid, true, 'email');
+				notify_user($user_guid, $CONFIG->site->guid, $notify_subject, $notify_message, NULL, 'email');
+			}
+			
+		} else
+			register_error(elgg_echo('email:confirm:fail'));
+	} else {
+		register_error(elgg_echo('email:confirm:fail'));
+	}
+		
+	access_show_hidden_entities($access_status);
+	
+	forward();
+	exit;
+
+?>
\ No newline at end of file
diff --git a/plugins/flexreg/actions/moderate.php b/plugins/flexreg/actions/moderate.php
new file mode 100644
index 0000000000000000000000000000000000000000..c9b9d43a86e13b08317434aca34310cb55207ee7
--- /dev/null
+++ b/plugins/flexreg/actions/moderate.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Elgg flexreg profile review action
+ * 
+ * @package flexreg
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Kevin Jardine <kevin@radagast.biz>
+ * @copyright Radagast Solutions 2009
+ * @link http://radagast.biz/
+ */
+
+global $CONFIG;
+
+admin_gatekeeper();
+
+$extra_message = trim(get_input('extra_message',''));
+$user_guid = get_input('user_guid',0);
+$decision = get_input('decision','');
+
+$access_status = access_get_show_hidden_status();
+access_show_hidden_entities(true);
+
+$user = get_user($user_guid);
+
+if ($decision == 'approve' ) {
+	system_message(elgg_echo('flexreg:approve:confirm'));
+	$notify_subject = sprintf(elgg_echo('flexreg:approve:subject'),$CONFIG->site->name);
+	$notify_message = sprintf(elgg_echo('flexreg:approve:body'), $user->name,$CONFIG->site->name);
+	if ($extra_message) {
+		$notify_message .= "\n\n".$extra_message."\n";
+	}
+	$welcome_blurb = trim(get_plugin_setting('welcome_blurb', 'flexreg'));
+	if ($welcome_blurb) {
+		$notify_message .= "\n\n".$welcome_blurb."\n";
+	}
+	$user->enable();
+	notify_user($user_guid, $CONFIG->site->guid, $notify_subject, $notify_message, NULL, 'email');
+} else if ($decision == 'reject') {
+	system_message(elgg_echo('flexreg:reject:confirm'));
+	$notify_subject = sprintf(elgg_echo('flexreg:reject:subject'),$CONFIG->site->name);
+	$notify_message = sprintf(elgg_echo('flexreg:reject:body'), $user->name,$CONFIG->site->name);
+	if ($extra_message) {
+		$notify_message .= "\n\n".$extra_message."\n";
+	}
+	notify_user($user_guid, $CONFIG->site->guid, $notify_subject, $notify_message, NULL, 'email');
+	$user->delete();
+}
+
+access_show_hidden_entities($access_status);
+
+forward($CONFIG->wwwroot.'mod/flexreg/moderate_users.php');
+
+?>
\ No newline at end of file
diff --git a/plugins/flexreg/actions/register.php b/plugins/flexreg/actions/register.php
new file mode 100644
index 0000000000000000000000000000000000000000..084b2738ff34a4905c9fff63fe9a1b89e986d766
--- /dev/null
+++ b/plugins/flexreg/actions/register.php
@@ -0,0 +1,167 @@
+<?php
+
+	/**
+	 * Elgg registration action
+	 * 
+	 * @package Elgg
+	 * @subpackage Core
+
+	 * @author Curverider Ltd
+
+	 * @link http://elgg.org/
+	 */
+
+	require_once(dirname(dirname(__FILE__)) . "/models/model.php");
+	require_once(dirname(dirname(dirname(__FILE__))).'/flexprofile/models/model.php');
+		
+	global $CONFIG;
+	
+	action_gatekeeper();
+	
+	$splitnames = get_plugin_setting('splitnames', 'flexreg') == 'yes';
+	$autousername = get_plugin_setting('autousername', 'flexreg') == 'yes';
+
+	// Get variables
+		$password = get_input('password');
+		$password2 = get_input('password2');
+		$email = get_input('email');
+		if ($splitnames) {
+			$first_name = trim(get_input('first_name',''));
+			$last_name = trim(get_input('last_name',''));
+			if ($first_name || $last_name) {
+				$name = $first_name . ' '.$last_name;
+			}
+		} else {
+			$name = get_input('name');
+		}
+		if($autousername && $name) {
+			// convert the supplied name to lowercase ascii and split it into pieces
+			$name_bits = explode(' ',strtolower(iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $name)));
+			$c = count($name_bits);
+			$username = '';
+			$i = 1;
+			// concatenate the first letter from each piece plus the entire last bit
+			// to create a user name like jmsmith
+			foreach($name_bits as $bit) {
+				if ($i == $c) {
+					$username .= trim($bit);
+				} else {
+					$username .= substr(trim($bit),0,1);
+				}
+				$i += 1;
+			}
+			if (strlen($username) < 4) {
+				$username .= 'xxxx';
+			}
+			
+			// ok, we have a candidate username
+			// make sure that it is not already in use,
+			// even by disabled users
+			$access_status = access_get_show_hidden_status();
+			access_show_hidden_entities(true);
+			if(get_user_by_username($username)) {
+				// oops, already in use, so try adding numbers to the end
+				// this tries about 100 times, so in theory it could fail
+				// TODO - do something reasonable upon failure
+				for ($i=2;$i<100;$i++) {
+					if (!get_user_by_username($username.$i)) {
+						$username .= $i;
+						break;
+					}
+				}
+			}
+			access_show_hidden_entities($access_status);
+		} else {
+			$username = get_input('username');
+		}
+		$friend_guid = (int) get_input('friend_guid',0);
+		$invitecode = get_input('invitecode');
+		$optional_groups = get_input('optional_groups','');
+		
+		$admin = get_input('admin');
+		if (is_array($admin)) $admin = $admin[0];
+		
+		
+		if (!$CONFIG->disable_registration)	{
+			$result = flexreg_validate_form();
+			if (flexreg_validate_basic_user_data($username, $password, $name, $email)) {
+				if (!$result->error_status) {
+		
+					try {
+						if (
+							(
+								(trim($password)!="") &&
+								(strcmp($password, $password2)==0) 
+							) &&
+							($guid = register_user($username, $password, $name, $email, false, $friend_guid, $invitecode))
+						) {
+							
+							$new_user = get_entity($guid);
+							if (($guid) && ($admin))
+							{
+								admin_gatekeeper(); // Only admins can make someone an admin
+								$new_user->admin = 'yes';
+							}
+							flexprofile_set_data($new_user,$result->form_data);
+							
+							// subscribe to optional groups
+							if($optional_groups) {
+								foreach($optional_groups as $group_guid) {
+									join_group($group_guid, $guid);
+								}
+							}
+							
+							//subscribe to automatic groups
+							$flexreg_automatic_groups = get_plugin_setting('automatic_groups', 'flexreg');
+							if (trim($flexreg_automatic_groups)) {
+								// make sure that we are using Unix line endings
+								$flexreg_automatic_groups = str_replace("\r\n","\n",$flexreg_automatic_groups);
+								$flexreg_automatic_groups = str_replace("\r","\n",$flexreg_automatic_groups);
+								$group_list = explode("\n",trim($flexreg_automatic_groups));
+								foreach($group_list as $group_guid) {
+									join_group($group_guid, $guid);
+								}
+							}
+							
+							trigger_elgg_event('registercomplete','user',array('entity'=>$new_user,'data'=>$result->form_data));
+							
+							// Send user validation request on register only
+							global $registering_admin;
+							if (!$registering_admin) {
+								request_user_validation($guid);
+							}
+							
+							if (!$new_user->admin) {
+								$new_user->disable('new_user', false);	// Now disable if not an admin
+							}
+							
+							//system_message(sprintf(elgg_echo("registerok"),$CONFIG->sitename));
+							
+							forward(); // Forward on success, assume everything else is an error...
+						} else {
+							register_error(elgg_echo("registerbad"));
+						}
+					} catch (RegistrationException $r) {
+						register_error($r->getMessage());
+						}
+					}
+				}
+			}
+		else
+			register_error(elgg_echo('registerdisabled'));
+			
+		// registration failed so redisplay form
+		
+		set_input('u',$username);
+		set_input('e',$email);
+		if ($splitnames) {
+			set_input('fn',$first_name);
+			set_input('ln',$last_name);
+		} else {
+			set_input('n',$name);
+		}
+			
+		$body = elgg_view('account/forms/register',array('data'=>$result->form_data,'friend_guid' => $friend_guid, 'invitecode' => $invitecode,'optional_groups'=>$optional_groups));
+		page_draw(elgg_echo('register'), $body);	
+
+?>
\ No newline at end of file
diff --git a/plugins/flexreg/languages/en.php b/plugins/flexreg/languages/en.php
new file mode 100644
index 0000000000000000000000000000000000000000..983856705f07093989317ff6af8fad43cf6a3c24
--- /dev/null
+++ b/plugins/flexreg/languages/en.php
@@ -0,0 +1,61 @@
+<?php
+
+	$english = array(
+	
+	'flexreg:namemissing' => "You must supply a name.",
+	'flexreg:email:confirm:success' => "You have confirmed your email address! A site moderator will review your application and you will be informed when your application is approved.",
+	'flexreg:moderate_users_title' => "Moderate users",
+	'flexreg:user:strapline' => "%s (%s) registered %s with email: %s",
+	'flexreg:no_users_to_moderate' => "There are no users to moderate.",
+	'flexreg:approve' => "Approve",
+	'flexreg:reject' => "Reject",
+	'flexreg:review' => "Review",
+	'flexreg:extended_profile_title' => "Data for %s (%s)",
+	'flexreg:error:body' => "An error has occurred. Please check the URL and try again.",
+	'flexreg:error:title' => "Error",
+	'flexreg:approve:confirm' => "You have approved this account.",
+	'flexreg:reject:confirm' => "You have rejected this account.",
+	'flexreg:moderate_title:approve' => "Approve account for %s (%s)",
+	'flexreg:moderate_title:reject' => "Reject account for %s (%s)",
+	'flexreg:moderate_description' => "Click the button below to confirm your decision. An email will be sent to notify this user.",
+	'flexreg:moderate_description2' => "You can optionally add some additional text to the email message by entering it into the box below.",
+	'flexreg:optional_groups' => "You can join any of the groups below by ticking the boxes next to their names.",
+	'flexreg:notification_subject' => "%s has a new account application",
+	'flexreg:notification_message' => "%s applied for an account for %s at %s.\n\nYou can review account applications by logging in as a site admin and visiting\n\n%s",
+	'flexreg:first_name' => "First name",
+	'flexreg:last_name' => "Last name",
+	
+	// settings
+	
+	'flexreg:settings:optional_groups' => "Optional groups. You can provide registrants with checkboxes listing groups that they can subscribe to with one click when they register. "
+	."Enter one group guid per line below.",
+	
+	'flexreg:settings:automatic_groups' => "Automatic groups. You can list one or more groups that registrants will automatically be subscribed to. "
+	."Enter one group guid per line below.",
+	
+	'flexreg:settings:splitnames' => "Ask for first name and last name at registration time instead of display name.",
+	'flexreg:settings:autousername' => "Automatically generate the username from the screen name rather than explicitly asking for one. (Best if the user is logging in using an email address.)",
+	'flexreg:settings:moderation' => "Registration moderation. If yes, accounts need to be approved by a site admin before they are activated.",
+	
+	'flexreg:settings:notifications_email' => "Notification address. If this is set below and registration moderation is turned on, "
+		."this email address will be notified of every membership application.",
+	'flexreg:settings:welcome_blurb' => "Welcome blurb. If registration moderation is turned on, the standard text below will "
+		."be included in the welcome message sent to the user notifying them that their account application has been approved. ",
+	
+	// email messages
+	
+	'flexreg:approve:subject' => "Your account for %s has been approved!",
+	'flexreg:approve:body' => "Hi %s,
+
+Your account at %s has been approved and you can now login using the username and password you supplied.",
+
+	'flexreg:reject:subject' => "Your account for %s has not been approved",
+	'flexreg:reject:body' => "Hi %s,
+
+Your account at %s has not been approved.",
+	
+	);
+					
+	add_translation("en",$english);
+
+?>
\ No newline at end of file
diff --git a/plugins/flexreg/manifest.xml b/plugins/flexreg/manifest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1cfdb8951b892d591998509d8b7a40c23936308c
--- /dev/null
+++ b/plugins/flexreg/manifest.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest>
+	<field key="author" value="Kevin Jardine &lt;kevin@radagast.biz&gt;" />
+	<field key="version" value="1.0" />
+	<field key="description" value="Integrates form plugin with registration forms" />
+	<field key="website" value="http://radagast.biz" ></field>
+	<field key="copyright" value="(C) Radagast Solutions 2009" />
+	<field key="licence" value="GNU Public License version 2" />
+	<field key="elgg_version" value="2009041701" />
+</plugin_manifest>
\ No newline at end of file
diff --git a/plugins/flexreg/models/model.php b/plugins/flexreg/models/model.php
new file mode 100644
index 0000000000000000000000000000000000000000..c88d42568625ba1946313d6eb8f3884e48ab5963
--- /dev/null
+++ b/plugins/flexreg/models/model.php
@@ -0,0 +1,299 @@
+<?php
+require_once(dirname(dirname(dirname(__FILE__))).'/form/models/form_types.php');
+
+function flexreg_get_registration_form() {
+    $form_array = get_entities_from_metadata('profile',FORM_REGISTRATION,'object','form:form');
+    if ($form_array) {
+    	return $form_array[0];
+    } else {
+    	return false;
+    }
+}
+
+function flexreg_get_html_from_registration_form($form,$data=null) {
+	$html = '';
+	if ($form->form_template) {
+		$results = form_get_data_for_templated_edit_form($form,$data,true);
+		//TODO: figure out what to do with $results['extra']
+		return form_render_form_template($form,$results['fields']);
+		//$html = form_apply_template_to_form_fields($form,$results);
+	} else {
+		// we currently don't support tabs on the registration form, so just 
+		// concatenate the html for each tab
+		$form_tabs = form_get_data_for_edit_form($form,$data,true);
+		$tabs = $form_tabs['main'];
+		if ($tabs) {
+			$html = '';
+			foreach ($tabs as $tab) {
+				$html .= $tab;
+			}
+		}
+		foreach ($form_tabs['extra'] as $tab) {
+			$html .= $tab;
+		}
+		$html = flexreg_get_standard_fields(true).$html;
+	}
+	
+	return $html;
+}
+
+function flexreg_validate_form() {
+	$form_field_types = form_get_form_field_types();	
+	$data = array();
+	$result = new StdClass();
+    $result->error_status = false;
+	$result->missing = array();
+	$result->invalid = array();
+	$form_id = get_input('form_id',0);
+	if ($form_id) {
+		$fields = form_get_fields($form_id);
+		if ($fields) {
+			foreach($fields as $field) {
+				$internal_name = $field->internal_name;
+				$item = new StdClass();
+				$item->access_id = form_get_default_access($field);
+				$value = get_input('form_data_'.$internal_name,'');
+				if ($value) {
+					if ($field->field_type == 'tags') {
+						$item->value = string_to_tag_array($value);
+					} else {
+						$item->value = $value;
+					}
+				}
+				$vf = $form_field_types[$field->field_type]->validation_function;
+				if ($field->required && (trim($value) === '')) {
+	                $result->error_status = true;
+	                $result->missing[] = $field;
+	            } else if ($vf && function_exists($vf)) {
+	            	$vf_result = $vf($value);
+	            	if (!$vf_result) {
+	            		$result->invalid[] = $field;
+	            		$result->error_status = true;
+	            	} else if ($vf_result !== true) {
+	            		// an error message
+	            		register_error($vf_result);
+	            		$result->error_status = true;
+	            	}
+	            }
+	            $data[$internal_name] = $item;
+			}			
+		}
+	}
+	
+	$result->form_data = $data;
+	
+	if ($result->error_status) {
+		$bad_fields = array_merge($result->missing,$result->invalid);
+		register_error(elgg_view('flexreg/invalid_error',array('invalid'=>$bad_fields)));
+	}
+	
+	return $result;
+}
+
+// the following function was created to do better error reporting
+// than register_user (plus we can validate the information separately before registration)
+
+function flexreg_validate_basic_user_data($username, $password, $name, $email, $allow_multiple_emails = false) {
+	global $CONFIG;
+	
+	$username = trim($username);
+	$password = trim($password);
+	$name = trim($name);
+	$email = trim($email);
+	
+	$valid = true;
+		
+	if (empty($name)) {
+		register_error(elgg_echo('flexreg:namemissing'));
+		$valid = false;
+	}	
+	
+	// Need to be able to compare with potentially disabled users
+	$access_status = access_get_show_hidden_status();
+	access_show_hidden_entities(true);
+		
+	try {
+		// Validate email address
+		if (empty($email) || !validate_email_address($email)) {
+			register_error(elgg_echo('registration:emailnotvalid'));
+			$valid = false;
+		}
+	
+		// Validate password
+		if (empty($password) || !validate_password($password)) {
+			register_error(elgg_echo('registration:passwordnotvalid'));
+			$valid = false;
+		}
+		
+		// Validate the username if not autousername
+		$autousername = get_plugin_setting('autousername', 'flexreg') == 'yes';
+		if (!$autousername) {
+			if (empty($username) || !validate_username($username)) {
+				register_error(elgg_echo('registration:usernamenotvalid'));
+				$valid = false;
+			}
+		}
+	} catch (RegistrationException $r) {
+		register_error($r->getMessage());
+		$valid = false;
+	}
+		
+	// Check to see if $username exists already
+	if ($valid && ($user = get_user_by_username($username))) {
+		//return false;
+		register_error(elgg_echo('registration:userexists'));
+		$valid = false;
+	}
+	
+	// If we're not allowed multiple emails then see if this address has been used before
+	if ($valid && (!$allow_multiple_emails) && (get_user_by_email($email)))
+	{
+		register_error(elgg_echo('registration:dupeemail'));
+		$valid = false;
+	}
+	
+	access_show_hidden_entities($access_status);
+	
+	return $valid;
+}
+
+/**
+ * A function that returns a maximum of $limit unmoderated users.
+ * These are defined to be users who are validated but disabled.
+ *
+ * @param int $limit Limit, default 10.
+ * @param int $offset Offset, default 0.
+ */
+function flexreg_get_unmoderated_users($limit = 10, $offset = 0) {
+	global $CONFIG;
+	
+	$meta_n = get_metastring_id('validated_method');
+	$value_n = get_metastring_id('email');
+	
+	if (!$meta_n || !$value_n) return false;
+	
+	$query =<<<END
+SELECT DISTINCT e.* FROM 
+{$CONFIG->dbprefix}entities e 
+JOIN {$CONFIG->dbprefix}users_entity u ON (e.guid = u.guid)
+JOIN {$CONFIG->dbprefix}metadata md ON (e.guid = md.entity_guid)
+WHERE e.enabled = 'no'
+AND md.name_id = $meta_n
+AND md.value_id = $value_n
+ORDER BY e.guid DESC
+limit {$offset},{$limit}
+END;
+	
+	return get_data($query, "entity_row_to_elggstar");
+}
+
+function flexreg_count_unmoderated_users() {
+	
+		global $CONFIG;
+		
+		$meta_n = get_metastring_id('validated_method');
+		$value_n = get_metastring_id('email');
+	
+	if (!$meta_n || !$value_n) return 0;
+	
+	$query =<<<END
+SELECT count(DISTINCT e.guid) AS count FROM 
+{$CONFIG->dbprefix}entities e 
+JOIN {$CONFIG->dbprefix}users_entity u ON (e.guid = u.guid)
+JOIN {$CONFIG->dbprefix}metadata md ON (e.guid = md.entity_guid)
+WHERE e.enabled = 'no'
+AND md.name_id = $meta_n
+AND md.value_id = $value_n
+END;
+		$result = get_data($query);
+		if ($result) {
+			return $result[0]->count;
+		} else {
+			return 0;
+		}
+}
+
+function flexreg_notify($user_data) {
+	global $CONFIG;
+	//print 'in flexreg_notify';
+	$to = trim(get_plugin_setting('notifications_email', 'flexreg'));
+	if ($to) {
+		//print 'preparing to send message';
+		$recipient = new stdClass();
+		$recipient->email = $to;
+		$site = get_entity($CONFIG->site_guid);
+    	$subject = sprintf(elgg_echo('flexreg:notification_subject'),$site->name);
+    	$url = $CONFIG->wwwroot.'mod/flexreg/moderate_users.php';
+    	$message = sprintf(elgg_echo('flexreg:notification_message'),$user_data,$site->name,date('r'),$url);
+
+        email_notify_handler( $site, $recipient, $subject, $message);
+        //print 'sent message';
+    }
+}
+
+function flexreg_get_standard_fields($as_html=true) {
+	$splitnames = get_plugin_setting('splitnames', 'flexreg') == 'yes';
+	$username = get_input('u');
+	$email = get_input('e');
+	
+	if ($splitnames) {
+		$first_name = get_input('fn','');
+		$last_name = get_input('ln','');
+		$first_name_title = elgg_echo('flexreg:first_name');
+		$last_name_title = elgg_echo('flexreg:last_name');
+		$first_name_input = elgg_view('input/text' , array('internalname' => 'first_name', 'class' => "general-textarea", 'value' => $first_name));
+		$last_name_input = elgg_view('input/text' , array('internalname' => 'last_name', 'class' => "general-textarea", 'value' => $last_name));
+		if ($as_html) {
+			$form_body = "<p><label>" . $first_name_title . "<br />" . $first_name_input . "</label><br />";
+			$form_body .= "<label>" . $last_name_title . "<br />" . $last_name_input . "</label><br />";
+		} else {
+			$tvars = array();
+			$tvars['_first_name:t'] = $first_name_title;
+			$tvars['_last_name:t'] = $last_name_title;
+			$tvars['_first_name:i'] = $first_name_input;
+			$tvars['_last_name:i'] = $last_name_input;
+		}
+	} else {
+		$name = get_input('n','');
+		$name_title = elgg_echo('name');
+		$name_input = elgg_view('input/text' , array('internalname' => 'name', 'class' => "general-textarea", 'value' => $name));
+		if ($as_html) {
+			$form_body = "<p><label>" . $name_title. "<br />" . $name_input . "</label><br />";
+		} else {
+			$tvars = array();
+			$tvars['_name:t'] = $name_title;
+			$tvars['_name:i'] = $name_input;
+		}
+	}
+	
+	$email_title = elgg_echo('email');
+	$email_input = elgg_view('input/text' , array('internalname' => 'email', 'class' => "general-textarea", 'value' => $email));
+	$username_title = elgg_echo('username');
+	$username_input = elgg_view('input/text' , array('internalname' => 'username', 'class' => "general-textarea", 'value' => $username));
+	$password_title = elgg_echo('password');
+	$password_input = elgg_view('input/password' , array('internalname' => 'password', 'class' => "general-textarea"));
+	$password2_title = elgg_echo('passwordagain');
+	$password2_input = elgg_view('input/password' , array('internalname' => 'password2', 'class' => "general-textarea"));
+	
+	if ($as_html) {
+		$form_body .= "<label>" . $email_title . "<br />" . $email_input . "</label><br />";
+		$form_body .= "<label>" . $username_title . "<br />" . $username_input . "</label><br />";
+		$form_body .= "<label>" . $password_title . "<br />" . $password_input . "</label><br />";
+		$form_body .= "<label>" . $password2_title . "<br />" . $password2_input . "</label><br />";
+		
+		return $form_body;
+	} else {
+		$tvars['_email:t'] = $email_title;
+		$tvars['_email:i'] = $email_input;
+		$tvars['_username:t'] = $username_title;
+		$tvars['_username:i'] = $username_input;
+		$tvars['_password:t'] = $password_title;
+		$tvars['_password:i'] = $password_input;
+		$tvars['_password2:t'] = $password2_title;
+		$tvars['_password2:i'] = $password2_input;
+		
+		return $tvars;
+	}
+	
+}
+?>
\ No newline at end of file
diff --git a/plugins/flexreg/moderate.php b/plugins/flexreg/moderate.php
new file mode 100644
index 0000000000000000000000000000000000000000..3cb03817f59236ed8190447c57b5f87d91e49a29
--- /dev/null
+++ b/plugins/flexreg/moderate.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Elgg flexreg profile review page
+ * 
+ * @package flexreg
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Kevin Jardine <kevin@radagast.biz>
+ * @copyright Radagast Solutions 2009
+ * @link http://radagast.biz/
+ */
+
+// Get the Elgg engine
+require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php");
+
+global $CONFIG;
+
+admin_gatekeeper();
+
+set_context('admin');
+
+$user_guid = get_input('guid');
+$decision = trim(get_input('decision'));
+
+$access_status = access_get_show_hidden_status();
+access_show_hidden_entities(true);
+
+$user = get_user($user_guid);
+if ($user && $decision) {
+	$body = elgg_view('flexreg/forms/moderate',array('user_guid'=>$user_guid,'decision'=>$decision));	
+	$title = sprintf(elgg_echo('flexreg:moderate_title:'.$decision),$user->name, $user->username);
+	
+} else {
+	$body = elgg_echo('flexreg:error:body');	
+	$title = elgg_echo('flexreg:error:title');	
+}
+
+$body = elgg_view('page_elements/contentwrapper',array('body'=>$body));
+
+page_draw($title,elgg_view_layout("two_column_left_sidebar", '', elgg_view_title($title) . $body));
+		
+access_show_hidden_entities($access_status);
+		
+?>
\ No newline at end of file
diff --git a/plugins/flexreg/moderate_users.php b/plugins/flexreg/moderate_users.php
new file mode 100644
index 0000000000000000000000000000000000000000..a5369fcbb4f2e5f43996207c71e3ab1f25aaa15d
--- /dev/null
+++ b/plugins/flexreg/moderate_users.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Allows admins to moderate users
+ * 
+ * @package flexreg
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Kevin Jardine <kevin@radagast.biz>
+ * @copyright Radagast Solutions 2009
+ * @link http://radagast.biz/
+ * 
+ */
+ 
+// Load Elgg engine
+require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php");
+
+// Load model
+require_once(dirname(__FILE__) . "/models/model.php");
+
+admin_gatekeeper();
+
+set_context('admin');
+
+$limit = get_input('limit', 10);
+$offset = get_input('offset', 0);
+
+$access_status = access_get_show_hidden_status();
+access_show_hidden_entities(true);
+
+$body = elgg_view('flexreg/moderate_users',array(
+	'user_list' => flexreg_get_unmoderated_users($limit,$offset),
+	'limit' => $limit,
+	'offset' => $offset,
+	'count' => flexreg_count_unmoderated_users(),
+	'baseurl' => $_SERVER['REQUEST_URI']
+));
+$body = elgg_view('page_elements/contentwrapper',array('body' =>$body));
+access_show_hidden_entities($access_status);
+$title = elgg_echo('flexreg:moderate_users_title');
+page_draw($title,elgg_view_layout("two_column_left_sidebar", '', elgg_view_title($title) . $body));
+
+?>
\ No newline at end of file
diff --git a/plugins/flexreg/profile.php b/plugins/flexreg/profile.php
new file mode 100644
index 0000000000000000000000000000000000000000..07cb25c059626f43452341abfac6d9f5205b7632
--- /dev/null
+++ b/plugins/flexreg/profile.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Elgg flexreg profile review page
+ * 
+ * @package flexreg
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Kevin Jardine <kevin@radagast.biz>
+ * @copyright Radagast Solutions 2009
+ * @link http://radagast.biz/
+ */
+
+// Get the Elgg engine
+require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php");
+
+global $CONFIG;
+
+admin_gatekeeper();
+
+// Get the username
+$username = get_input('username');
+
+$access_status = access_get_show_hidden_status();
+access_show_hidden_entities(true);
+
+// Define context
+set_context('flexreg');
+
+$user = get_user_by_username($username);
+add_submenu_item(elgg_echo('flexreg:approve'),$CONFIG->wwwroot.'mod/flexreg/moderate.php?guid='.$user->guid.'&decision=approve');
+add_submenu_item(elgg_echo('flexreg:reject'),$CONFIG->wwwroot.'mod/flexreg/moderate.php?guid='.$user->guid.'&decision=reject');
+add_submenu_item(elgg_echo('flexreg:moderate_users_title'),$CONFIG->wwwroot.'mod/flexreg/moderate_users.php');
+
+$body = elgg_view('flexprofile/extended',array('entity'=>$user));
+
+$title = sprintf(elgg_echo('flexreg:extended_profile_title'),$user->name, $username);
+
+page_draw($title,elgg_view_layout("two_column_left_sidebar", '', elgg_view_title($title) . $body));
+		
+access_show_hidden_entities($access_status);
+		
+?>
\ No newline at end of file
diff --git a/plugins/flexreg/start.php b/plugins/flexreg/start.php
new file mode 100644
index 0000000000000000000000000000000000000000..bcfcc9b96a5786f0341fa20274328490fba558f5
--- /dev/null
+++ b/plugins/flexreg/start.php
@@ -0,0 +1,32 @@
+<?php
+
+function flexreg_init() {
+	global $CONFIG;
+		
+	// need to put this here because the original "register" action is set up in
+	// users_init
+	
+	register_action("register",true,$CONFIG->pluginspath . "flexreg/actions/register.php");
+	
+	register_action("email/confirm",true, $CONFIG->pluginspath . "flexreg/actions/confirm.php");
+	
+	register_action("flexreg/moderate",false, $CONFIG->pluginspath . "flexreg/actions/moderate.php");
+	
+}
+
+function flexreg_pagesetup() {
+	global $CONFIG;
+	
+	$flexreg_moderation = get_plugin_setting('moderation', 'flexreg');
+
+	if ((get_context() == 'admin') && ($flexreg_moderation == 'yes')) {
+		add_submenu_item(elgg_echo('flexreg:moderate_users_title'), $CONFIG->wwwroot."mod/flexreg/moderate_users.php");
+	}
+}
+
+// Make sure flexreg_init is called after uservalidationbyemail
+// to over-write that action
+register_elgg_event_handler('init','system','flexreg_init',700);
+register_elgg_event_handler('pagesetup','system','flexreg_pagesetup');
+
+?>
\ No newline at end of file
diff --git a/plugins/flexreg/views/default/account/forms/register.php b/plugins/flexreg/views/default/account/forms/register.php
new file mode 100644
index 0000000000000000000000000000000000000000..c3a05a88bb8fbec34d332a1f32159d14c8e7945c
--- /dev/null
+++ b/plugins/flexreg/views/default/account/forms/register.php
@@ -0,0 +1,84 @@
+<?php
+
+     /**
+	 * Elgg register form
+	 * 
+	 * @package Elgg
+	 * @subpackage Core
+
+	 * @author Curverider Ltd
+
+	 * @link http://elgg.org/
+	 */
+
+// Load plugin model
+require_once(dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/models/model.php");
+
+$reg_html = '';
+$reg_description = '';
+$reg_form = flexreg_get_registration_form();
+if ($reg_form) {
+	if (trim($reg_form->description)) {
+		$reg_description = '<p>'.$reg_form->description.'</p>';
+	}
+	$data = $vars['data'];
+	if ($data) {
+		// this is a form redisplay (because of an error), so pre-populate the form
+		$reg_html = flexreg_get_html_from_registration_form($reg_form,$data);
+	} else {
+		$reg_html = flexreg_get_html_from_registration_form($reg_form);
+	}
+	$reg_html .= elgg_view('input/hidden', array('internalname' => 'form_id', 'value' => $reg_form->getGUID()));
+}
+
+// Add checkboxes for optional groups, if defined
+
+$flexreg_optional_groups = get_plugin_setting('optional_groups', 'flexreg');
+if (trim($flexreg_optional_groups)) {
+	// make sure that we are using Unix line endings
+	$flexreg_optional_groups = str_replace("\r\n","\n",$flexreg_optional_groups);
+	$flexreg_optional_groups = str_replace("\r","\n",$flexreg_optional_groups);
+	$group_list = explode("\n",trim($flexreg_optional_groups));
+	$options = array();
+	foreach($group_list as $group_guid) {
+		$group = get_entity($group_guid);
+		if ($group) {
+			$options[$group->name] = $group_guid;
+		}
+	}
+	$reg_html .= '<label>'. elgg_echo('flexreg:optional_groups').'<br /><br />';
+	$reg_html .= elgg_view('input/checkboxes',array('internalname'=>'optional_groups','options'=>$options,'value'=>$vars['optional_groups']));
+	$reg_html .= '</label>';
+}
+	
+// add extra fields if any
+$form_body = $reg_html;
+
+// Add captcha hook
+$form_body .= elgg_view('input/captcha');
+
+$admin_option = false;
+if (($_SESSION['user']->admin) && ($vars['show_admin'])) 
+	$admin_option = true;
+
+if ($admin_option)
+	$form_body .= elgg_view('input/checkboxes', array('internalname' => "admin", 'options' => array(elgg_echo('admin_option'))));
+
+$form_body .= elgg_view('input/hidden', array('internalname' => 'friend_guid', 'value' => $vars['friend_guid']));
+$form_body .= elgg_view('input/hidden', array('internalname' => 'invitecode', 'value' => $vars['invitecode']));
+$form_body .= elgg_view('input/hidden', array('internalname' => 'action', 'value' => 'register'));
+$form_body .= elgg_view('input/submit', array('internalname' => 'submit', 'value' => elgg_echo('register'))) . "</p>";
+
+$content = '<div id="register-box">';
+$content .= '<h2>'.elgg_echo('register').'</h2>';
+$content .= $reg_description;
+$content .= elgg_view('input/form', array('action' => "{$vars['url']}action/register", 'body' => $form_body));
+$content .= '</div> <!-- /register-box -->';
+
+// Oxfam Novib specific stuff - redo for general release
+//$sidebar = elgg_view('on_plugin/registration/sidebar');
+//$content .= elgg_view('on_plugin/registration/js');
+
+//echo elgg_view_layout("sidebar_boxes", $sidebar , $content);
+
+echo $content;
\ No newline at end of file
diff --git a/plugins/flexreg/views/default/flexreg/forms/moderate.php b/plugins/flexreg/views/default/flexreg/forms/moderate.php
new file mode 100644
index 0000000000000000000000000000000000000000..e06de06f521acca295467a2ed962629d5f512031
--- /dev/null
+++ b/plugins/flexreg/views/default/flexreg/forms/moderate.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Elgg flexreg profile review view
+ * 
+ * @package flexreg
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Kevin Jardine <kevin@radagast.biz>
+ * @copyright Radagast Solutions 2009
+ * @link http://radagast.biz/
+ */
+
+$decision = $vars['decision'];
+$body = elgg_view('input/hidden',array('internalname'=>'user_guid','value'=>$vars['user_guid']));
+$body .= elgg_view('input/hidden',array('internalname'=>'decision','value'=>$decision));
+$body .= elgg_view('form/input/longtext',array('internalname'=>'extra_message'));
+$body .= elgg_view('input/submit',array('value'=>elgg_echo('flexreg:'.$decision)));
+
+$body = elgg_view('input/form',array('action'=>$vars['url'].'action/flexreg/moderate','body'=>$body));
+
+$md = '<p>'.elgg_echo('flexreg:moderate_description').'</p>';
+$md2 = '<p>'.elgg_echo('flexreg:moderate_description2').'</p>';
+echo $md.$md2.$body;
+?>
\ No newline at end of file
diff --git a/plugins/flexreg/views/default/flexreg/invalid_error.php b/plugins/flexreg/views/default/flexreg/invalid_error.php
new file mode 100644
index 0000000000000000000000000000000000000000..360b519b6063f81347616e542e65e56d466f8cb7
--- /dev/null
+++ b/plugins/flexreg/views/default/flexreg/invalid_error.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+    * Elgg display invalid fields message
+    * 
+    * @package Elgg
+    * @subpackage Form
+    * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+    * @author Kevin Jardine <kevin@radagast.biz>
+    * @copyright Radagast Solutions 2008
+    * @link http://radagast.biz/
+    */
+    
+    $missing = $vars['invalid'];
+    $labels = array();
+    foreach($missing as $field) {
+        $labels[] = $field->title;
+    }    
+    
+    print sprintf(elgg_echo('form:error_missing_fields'),implode(', ',$labels));
+?>
\ No newline at end of file
diff --git a/plugins/flexreg/views/default/flexreg/moderate_users.php b/plugins/flexreg/views/default/flexreg/moderate_users.php
new file mode 100644
index 0000000000000000000000000000000000000000..6210da826fb7e8e9b6cfc0617f83055de6e1c0df
--- /dev/null
+++ b/plugins/flexreg/views/default/flexreg/moderate_users.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * View to list unmoderated users
+ * 
+ * @package flexreg
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Kevin Jardine <kevin@radagast.biz>
+ * @copyright Radagast Solutions 2009
+ * @link http://radagast.biz/
+ */
+
+$user_list = $vars['user_list'];
+$nav = elgg_view('navigation/pagination',array(
+	
+			'baseurl' => $vars['baseurl'],
+			'offset' => $vars['offset'],
+			'count' => $vars['count'],
+			'limit' => $vars['limit'],
+	
+));
+
+echo $nav;
+if ($user_list) {
+	foreach ($user_list as $user) {
+		$icon = elgg_view(
+				'graphics/icon', array(
+				'entity' => $user,
+				'size' => 'small',
+			));
+		$usertxt = "<b>" . $user->name ."</b>";
+		$reviewbit = '<br /><a href="'.$vars['url'].'mod/flexreg/profile.php?username='.$user->username.'">'.elgg_echo('flexreg:review').'</a>';
+		
+		$info = "<div>".sprintf(elgg_echo("flexreg:user:strapline"),
+						$usertxt,
+						$user->username,
+						friendly_time($user->time_created),
+						$user->email
+		).$reviewbit."</div>";
+		
+		echo elgg_view_listing($icon, $info);
+
+	}
+} else {
+	echo elgg_echo('flexreg:no_users_to_moderate');
+}
+echo $nav;
+?>
\ No newline at end of file
diff --git a/plugins/flexreg/views/default/settings/flexreg/edit.php b/plugins/flexreg/views/default/settings/flexreg/edit.php
new file mode 100644
index 0000000000000000000000000000000000000000..eb726ecfd676f562424cedd021f52eacb8ab11a6
--- /dev/null
+++ b/plugins/flexreg/views/default/settings/flexreg/edit.php
@@ -0,0 +1,73 @@
+<?php
+$options = array(elgg_echo('form:yes')=>'yes',
+	elgg_echo('form:no')=>'no',
+);
+
+$flexreg_optional_groups = get_plugin_setting('optional_groups', 'flexreg');
+
+$body .= elgg_echo('flexreg:settings:optional_groups');
+$body .= '<br /><br />';
+$body .= elgg_view('form/input/longtext',array('internalname'=>'params[optional_groups]','value'=>$flexreg_optional_groups));
+
+$body .= '<br /><br />';
+
+$flexreg_automatic_groups = get_plugin_setting('automatic_groups', 'flexreg');
+
+$body .= elgg_echo('flexreg:settings:automatic_groups');
+$body .= '<br /><br />';
+$body .= elgg_view('form/input/longtext',array('internalname'=>'params[automatic_groups]','value'=>$flexreg_automatic_groups));
+
+$body .= '<br /><br />';
+
+$flexreg_splitnames = get_plugin_setting('splitnames', 'flexreg');
+
+if (!$flexreg_splitnames) {
+	$flexreg_splitnames = 'no';
+}
+
+$body .= elgg_echo('flexreg:settings:splitnames');
+$body .= '<br />';
+$body .= elgg_view('input/radio',array('internalname'=>'params[splitnames]','value'=>$flexreg_splitnames,'options'=>$options));
+
+$body .= '<br />';
+
+$flexreg_autousername = get_plugin_setting('autousername', 'flexreg');
+
+if (!$flexreg_autousername) {
+	$flexreg_autousername = 'no';
+}
+
+$body .= elgg_echo('flexreg:settings:autousername');
+$body .= '<br />';
+$body .= elgg_view('input/radio',array('internalname'=>'params[autousername]','value'=>$flexreg_autousername,'options'=>$options));
+
+$body .= '<br />';
+
+$flexreg_moderation = get_plugin_setting('moderation', 'flexreg');
+
+if (!$flexreg_moderation) {
+	$flexreg_moderation = 'no';
+}
+
+$body .= elgg_echo('flexreg:settings:moderation');
+$body .= '<br />';
+$body .= elgg_view('input/radio',array('internalname'=>'params[moderation]','value'=>$flexreg_moderation,'options'=>$options));
+
+$body .= '<br />';
+
+$flexreg_notifications_email = get_plugin_setting('notifications_email', 'flexreg');
+
+$body .= elgg_echo('flexreg:settings:notifications_email');
+$body .= '<br /><br />';
+$body .= elgg_view('input/text',array('internalname'=>'params[notifications_email]','value'=>$flexreg_notifications_email));
+
+$body .= '<br /><br />';
+
+$flexreg_welcome_blurb = get_plugin_setting('welcome_blurb', 'flexreg');
+
+$body .= elgg_echo('flexreg:settings:welcome_blurb');
+$body .= '<br /><br />';
+$body .= elgg_view('form/input/longtext',array('internalname'=>'params[welcome_blurb]','value'=>$flexreg_welcome_blurb));
+
+echo $body;
+?>
\ No newline at end of file