diff --git bp-core/bp-core-functions.php bp-core/bp-core-functions.php
index 617abae..0f03f7a 100644
--- bp-core/bp-core-functions.php
+++ bp-core/bp-core-functions.php
@@ -265,6 +265,26 @@ function bp_esc_sql_order( $order = '' ) {
 }
 
 /**
+ * Filter SQL query strings to swap out the 'meta_id' column.
+ *
+ * WordPress uses the meta_id column for commentmeta and postmeta, and so
+ * hardcodes the column name into its *_metadata() functions. BuddyPress, on
+ * the other hand, uses 'id' for the primary column. To make WP's functions
+ * usable for BuddyPress, we use this just-in-time filter on 'query' to swap
+ * 'meta_id' with 'id.
+ *
+ * @since BuddyPress (2.0.0)
+ *
+ * @access private Do not use.
+ *
+ * @param string $q SQL query.
+ * @return string
+ */
+function bp_filter_metaid_column_name( $q ) {
+	return str_replace( 'meta_id', 'id', $q );
+}
+
+/**
  * Are we running username compatibility mode?
  *
  * @since BuddyPress (1.5.0)
diff --git bp-groups/bp-groups-functions.php bp-groups/bp-groups-functions.php
index 072bdd8..8fe7dfe 100644
--- bp-groups/bp-groups-functions.php
+++ bp-groups/bp-groups-functions.php
@@ -957,93 +957,52 @@ function groups_accept_all_pending_membership_requests( $group_id ) {
 /*** Group Meta ****************************************************/
 
 function groups_delete_groupmeta( $group_id, $meta_key = false, $meta_value = false ) {
-	global $wpdb, $bp;
-
-	if ( !is_numeric( $group_id ) )
+	// Legacy - return false if non-int group ID
+	if ( ! is_numeric( $group_id ) ) {
 		return false;
+	}
 
+	// Legacy - Sanitize keys
 	$meta_key = preg_replace( '|[^a-z0-9_]|i', '', $meta_key );
 
-	if ( is_array( $meta_value ) || is_object( $meta_value ) )
-		$meta_value = serialize($meta_value);
-
-	$meta_value = trim( $meta_value );
-
-	if ( !$meta_key )
-		$wpdb->query( $wpdb->prepare( "DELETE FROM " . $bp->groups->table_name_groupmeta . " WHERE group_id = %d", $group_id ) );
-	else if ( $meta_value )
-		$wpdb->query( $wpdb->prepare( "DELETE FROM " . $bp->groups->table_name_groupmeta . " WHERE group_id = %d AND meta_key = %s AND meta_value = %s", $group_id, $meta_key, $meta_value ) );
-	else
-		$wpdb->query( $wpdb->prepare( "DELETE FROM " . $bp->groups->table_name_groupmeta . " WHERE group_id = %d AND meta_key = %s", $group_id, $meta_key ) );
-
-	// Delete the cached object
-	wp_cache_delete( 'bp_groups_groupmeta_' . $group_id . '_' . $meta_key, 'bp' );
+	add_filter( 'query', 'bp_filter_metaid_column_name' );
+	$retval = delete_metadata( 'group', $group_id, $meta_key, $meta_value, $delete_all );
+	remove_filter( 'query', 'bp_filter_metaid_column_name' );
 
 	return true;
 }
 
 function groups_get_groupmeta( $group_id, $meta_key = '') {
-	global $wpdb, $bp;
-
-	$group_id = (int) $group_id;
-
-	if ( !$group_id )
-		return false;
+	// Legacy - Sanitize keys
+	$meta_key = preg_replace( '|[^a-z0-9_]|i', '', $meta_key );
 
-	if ( !empty($meta_key) ) {
-		$meta_key = preg_replace( '|[^a-z0-9_]|i', '', $meta_key );
+	add_filter( 'query', 'bp_filter_metaid_column_name' );
+	$retval = get_metadata( 'group', $group_id, $meta_key, true );
+	remove_filter( 'query', 'bp_filter_metaid_column_name' );
 
-		$metas = wp_cache_get( 'bp_groups_groupmeta_' . $group_id . '_' . $meta_key, 'bp' );
-		if ( false === $metas ) {
-			$metas = $wpdb->get_col( $wpdb->prepare("SELECT meta_value FROM " . $bp->groups->table_name_groupmeta . " WHERE group_id = %d AND meta_key = %s", $group_id, $meta_key ) );
-			wp_cache_set( 'bp_groups_groupmeta_' . $group_id . '_' . $meta_key, $metas, 'bp' );
+	// Legacy - If fetching all meta for a group, just return values
+	if ( empty( $meta_key ) ) {
+		$values = array();
+		foreach ( (array) $retval as $r ) {
+			$values[] = array_pop( $r );
 		}
-	} else {
-		$metas = $wpdb->get_col( $wpdb->prepare("SELECT meta_value FROM " . $bp->groups->table_name_groupmeta . " WHERE group_id = %d", $group_id ) );
+		$retval = $values;
 	}
 
-	if ( empty( $metas ) ) {
-		if ( empty( $meta_key ) )
-			return array();
-		else
-			return '';
-	}
-
-	$metas = array_map( 'maybe_unserialize', (array) $metas );
-
-	if ( 1 == count( $metas ) )
-		return $metas[0];
-	else
-		return $metas;
+	return $retval;
 }
 
 function groups_update_groupmeta( $group_id, $meta_key, $meta_value ) {
-	global $wpdb, $bp;
-
-	if ( !is_numeric( $group_id ) )
-		return false;
+	add_filter( 'query', 'bp_filter_metaid_column_name' );
+	$retval = update_metadata( 'group', $group_id, $meta_key, $meta_value );
+	remove_filter( 'query', 'bp_filter_metaid_column_name' );
 
-	$meta_key = preg_replace( '|[^a-z0-9_]|i', '', $meta_key );
-
-	if ( is_string( $meta_value ) ) {
-		$meta_value = stripslashes( $meta_value );
+	// Legacy - return true if we fall through to add_metadata()
+	if ( is_int( $retval ) ) {
+		$retval = true;
 	}
 
-	$meta_value = maybe_serialize( $meta_value );
-
-	$cur = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM " . $bp->groups->table_name_groupmeta . " WHERE group_id = %d AND meta_key = %s", $group_id, $meta_key ) );
-
-	if ( !$cur )
-		$wpdb->query( $wpdb->prepare( "INSERT INTO " . $bp->groups->table_name_groupmeta . " ( group_id, meta_key, meta_value ) VALUES ( %d, %s, %s )", $group_id, $meta_key, $meta_value ) );
-	else if ( $cur->meta_value != $meta_value )
-		$wpdb->query( $wpdb->prepare( "UPDATE " . $bp->groups->table_name_groupmeta . " SET meta_value = %s WHERE group_id = %d AND meta_key = %s", $meta_value, $group_id, $meta_key ) );
-	else
-		return false;
-
-	// Update the cached object and recache
-	wp_cache_set( 'bp_groups_groupmeta_' . $group_id . '_' . $meta_key, $meta_value, 'bp' );
-
-	return true;
+	return $retval;
 }
 
 /*** Group Cleanup Functions ****************************************************/
diff --git bp-groups/bp-groups-loader.php bp-groups/bp-groups-loader.php
index 6862000..baa014a 100644
--- bp-groups/bp-groups-loader.php
+++ bp-groups/bp-groups-loader.php
@@ -123,6 +123,8 @@ class BP_Groups_Component extends BP_Component {
 	 * @since BuddyPress (1.5)
 	 */
 	public function setup_globals( $args = array() ) {
+		global $wpdb;
+
 		$bp = buddypress();
 
 		// Define a slug, if necessary
@@ -149,6 +151,8 @@ class BP_Groups_Component extends BP_Component {
 
 		parent::setup_globals( $args );
 
+		$wpdb->groupmeta = $this->table_name_groupmeta;
+
 		/** Single Group Globals **********************************************/
 
 		// Are we viewing a single group?
