Index: gp-templates/profile.php
===================================================================
--- gp-templates/profile.php	(revision 0)
+++ gp-templates/profile.php	(revision 0)
@@ -0,0 +1,16 @@
+<?php 
+gp_title( __('Profile &lt; GlotPress') );
+gp_breadcrumb( array( __('Profile') ) );
+gp_tmpl_header();
+
+$per_page = GP::$user->get_meta('per_page');
+if ( 0 == $per_page )
+	$per_page = 15;
+	
+?>
+<h2><?php _e( "Profile" ); ?></h2>
+<form method="post">
+	<label for="per_page"><?php _e( "Number of items per page:" ); ?></label>
+	<input type="number" id="per_page" name="per_page" value="<?php echo $per_page ?>"/><br>
+	<input type="submit" value="<?php _e("Change Settings"); ?>">
+</form>
\ No newline at end of file
Index: gp-templates/header.php
===================================================================
--- gp-templates/header.php	(revision 633)
+++ gp-templates/header.php	(working copy)
@@ -22,7 +22,7 @@
 			if (GP::$user->logged_in()):
 				$user = GP::$user->current();
 				
-				printf( __('Hi, %s.'), $user->user_login );
+				printf( __('Hi, %s.'), '<a href="'.gp_url( '/profile' ).'">'.$user->user_login.'</a>' );
 				?>
 				<a href="<?php echo gp_url('/logout')?>"><?php _e('Log out'); ?></a>
 			<?php else: ?>
Index: gp-includes/routes/profile.php
===================================================================
--- gp-includes/routes/profile.php	(revision 0)
+++ gp-includes/routes/profile.php	(revision 0)
@@ -0,0 +1,15 @@
+<?php
+class GP_Route_Profile extends GP_Route_Main {
+	function profile_get() {
+		gp_tmpl_load( 'profile', array() );
+	}
+
+	function profile_post() {
+		if ( isset( $_POST['per_page'] ) ) {
+			$per_page = (int) $_POST['per_page'];
+			GP::$user->set_meta( 'per_page', $per_page );
+		}
+		
+		$this->redirect( gp_url( '/profile' ) );
+	}
+}
Index: gp-includes/things/translation.php
===================================================================
--- gp-includes/things/translation.php	(revision 633)
+++ gp-includes/things/translation.php	(working copy)
@@ -155,7 +155,13 @@
 		}
 
 		$sql_sort = sprintf( $sort_by, $sort_how );
-		$limit = $this->sql_limit_for_paging( $page );
+
+		$per_page = GP::$user->get_meta('per_page');
+		if ( 0 == $per_page )
+			$per_page = $this->per_page;
+			
+		$limit = $this->sql_limit_for_paging( $page, $per_page );
+
 		$rows = $this->many_no_map( "
 		    SELECT SQL_CALC_FOUND_ROWS t.*, o.*, t.id as id, o.id as original_id, t.status as translation_status, o.status as original_status, t.date_added as translation_added, o.date_added as original_added
 		    FROM $gpdb->originals as o
Index: gp-includes/things/user.php
===================================================================
--- gp-includes/things/user.php	(revision 633)
+++ gp-includes/things/user.php	(working copy)
@@ -112,10 +112,7 @@
 	}
 	
 	function get_meta( $key ) {
-		global $wp_users_object;
-		if ( !$user = $wp_users_object->get_user( $this->id ) ) {
-			return;
-		}
+		$user = $this->current();
 
 		$key = gp_sanitize_meta_key( $key );
 		if ( !isset( $user->$key ) ) {
@@ -125,11 +122,13 @@
 	}
 	
 	function set_meta( $key, $value ) {
-		return gp_update_meta( $this->id, $key, $value, 'user' );
+		$user = $this->current();
+		return gp_update_meta( $user->id, $key, $value, 'user' );
 	}
 	
 	function delete_meta( $key ) {
-		return gp_delete_meta( $this->id, $key, '', 'user' );
+		$user = $this->current();
+		return gp_delete_meta( $user->id, $key, '', 'user' );
 	}
 	
 	
Index: gp-includes/thing.php
===================================================================
--- gp-includes/thing.php	(revision 633)
+++ gp-includes/thing.php	(working copy)
@@ -383,7 +383,7 @@
 		$per_page = is_null( $per_page )? $this->per_page : $per_page;
 		if ( 'no-limit' == $per_page || 'no-limit' == $page ) return '';
 		$page = intval( $page )? intval( $page ) : 1;
-		return sprintf( "LIMIT %d OFFSET %d", $this->per_page, ($page-1)*$this->per_page );
+		return sprintf( "LIMIT %d OFFSET %d", $per_page, ($page-1)*$per_page );
 	}
 	
 	function found_rows() {
Index: gp-includes/router.php
===================================================================
--- gp-includes/router.php	(revision 633)
+++ gp-includes/router.php	(working copy)
@@ -44,6 +44,9 @@
 			'get:/login' => array('GP_Route_Login', 'login_get'),
 			'post:/login' => array('GP_Route_Login', 'login_post'),
 			'get:/logout' => array('GP_Route_Login', 'logout'),
+			
+			'get:/profile' => array('GP_Route_Profile', 'profile_get'),
+			'post:/profile' => array('GP_Route_Profile', 'profile_post'),
 
 			"get:/$project/import-originals" => array('GP_Route_Project', 'import_originals_get'),
 			"post:/$project/import-originals" => array('GP_Route_Project', 'import_originals_post'),
Index: gp-includes/meta.php
===================================================================
--- gp-includes/meta.php	(revision 633)
+++ gp-includes/meta.php	(working copy)
@@ -17,7 +17,8 @@
  */
 function gp_update_meta( $object_id = 0, $meta_key, $meta_value, $type, $global = false ) {
 	global $gpdb;
-	if ( !is_numeric( $object_id ) || empty( $object_id ) && !$global ) {
+
+	if ( !is_numeric( $object_id ) || empty( $object_id ) ) {
 		return false;
 	}
 	$cache_object_id = $object_id = (int) $object_id;
