diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..9a1c3ae12362e73cff697f50cfc5bd721c0b8557
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+*.pyc
+*.svn
diff --git a/client.py b/client.py
index ccf17934b33558db077cd964c8f246d3ac8a27d3..ade12911764791594e1e89a0af6734ca73e94d83 100644
--- a/client.py
+++ b/client.py
@@ -418,9 +418,11 @@ class Site(object):
 				self.wait(wait_token)
 			file.seek(0, 0)
 			
-	def parse(self, text, title = None):
-		kwargs = {'text': text}
+	def parse(self, text = None, title = None, page = None):
+		kwargs = {}
+		if text is not None: kwargs['text'] = text
 		if title is not None: kwargs['title'] = title
+		if page is not None: kwargs['page'] = page
 		result = self.api('parse', **kwargs)
 		return result['parse']
 	
diff --git a/listing.py b/listing.py
index 3c510959b5bf0f62bc69b828cf3e15b1e41b4bac..b438b1a6d0b1e7cffb9b8eda9effedc6f7e3fbdf 100644
--- a/listing.py
+++ b/listing.py
@@ -169,13 +169,13 @@ class PageList(GeneratorList):
 			return page.Page(self.site, self.site.namespaces[self.namespace] + ':' + name, info)
 		else:
 			# Guessing page class
-			namespace = self.guess_namespace(name)
-			if namespace == 14:
-				return Category(self.site, name, info)
-			elif namespace == 6:
-				return page.Image(self.site, name, info)
-			else:
-				return page.Page(self.site, name, info)
+			if type(name) is not int:
+				namespace = self.guess_namespace(name)
+				if namespace == 14:
+					return Category(self.site, name, info)
+				elif namespace == 6:
+					return page.Image(self.site, name, info)
+			return page.Page(self.site, name, info)
 		
 	def guess_namespace(self, name):
 		normal_name = page.Page.normalize_title(name)
@@ -194,12 +194,11 @@ class PageProperty(List):
 		List.__init__(self, page.site, prop, prefix, titles = page.name, *args, **kwargs)
 		self.page = page
 		self.generator = 'prop'
-
 	def set_iter(self, data):
 		for page in data['query']['pages'].itervalues():
-			if page['title'] == self.page.name:
-				self._iter = iter(page.get(self.list_name, ()))
-				return
+			#if page['title'] == self.page.name:
+			self._iter = iter(page.get(self.list_name, ()))
+			return
 		raise StopIteration
 
 		
diff --git a/page.py b/page.py
index 14e3b9cb0096217568d6f3878777c65f5f53d0cc..a5cf77cb25130f9762a18f713b318edf482bbe99 100644
--- a/page.py
+++ b/page.py
@@ -10,6 +10,7 @@ class Page(object):
 			return self.__dict__.update(name.__dict__)
 		self.site = site
 		self.name = name
+		self.section = None
 		
 		if not info:
 			if extra_properties:
@@ -20,8 +21,12 @@ class Page(object):
 				prop = 'info'
 				extra_props = ()
 			
-			info = self.site.api('query', prop = prop, titles = name, 
-				inprop = 'protection', *extra_props)
+			if type(name) is int:
+				info = self.site.api('query', prop = prop, pageids = name, 
+					inprop = 'protection', *extra_props)
+			else:
+				info = self.site.api('query', prop = prop, titles = name, 
+					inprop = 'protection', *extra_props)
 			info = info['query']['pages'].itervalues().next()
 		self._info = info
 				
@@ -34,7 +39,7 @@ class Page(object):
 
 		self.touched = client.parse_timestamp(info.get('touched', '0000-00-00T00:00:00Z'))
 		self.revision = info.get('lastrevid', 0)
-		self.exists = 'missing' not in info
+		self.exists = ('missing' not in info and 'invalid' not in info) # a page "<hello>" will not return missing, but invalid
 		self.length = info.get('length')
 		self.protection = dict([(i['type'], (i['level'], i['expiry'])) for i in info.get('protection', ()) if i])
 		self.redirect = 'redirect' in info
@@ -104,18 +109,20 @@ class Page(object):
 		if not self.exists:
 			return u''
 			
-		revs = self.revisions(prop = 'content|timestamp', limit = 1)
+		revs = self.revisions(prop = 'content|timestamp', limit = 1, section = section)
 		try:
 			rev = revs.next()
 			self.text = rev['*']
+			self.section = section
 			self.last_rev_time = rev['timestamp']
 		except StopIteration:
 			self.text = u''
+			self.section = None
 			self.edit_time = None
 		self.edit_time = time.gmtime()
 		return self.text
 	
-	def save(self, text = u'', summary = u'', minor = False, bot = True, **kwargs):
+	def save(self, text = u'', summary = u'', minor = False, bot = True, section = None, **kwargs):
         """Save text of page."""
 		if not self.site.logged_in and self.site.force_login:
 			# Should we really check for this?
@@ -126,6 +133,7 @@ class Page(object):
 			raise errors.ProtectedPageError(self)
 		
 		if not text: text = self.text
+		if not section: section = self.section
 		
 		if not self.site.writeapi:
 			return OldPage.save(self, text = text, summary = summary, minor = False)
@@ -136,6 +144,7 @@ class Page(object):
 		if self.last_rev_time: data['basetimestamp'] = time.strftime('%Y%m%d%H%M%S', self.last_rev_time)
 		if self.edit_time: data['starttimestamp'] = time.strftime('%Y%m%d%H%M%S', self.edit_time)
 		if bot: data['bot'] = '1'
+		if section: data['section'] = section
 		
 		data.update(kwargs)
 		
@@ -277,27 +286,29 @@ class Page(object):
 		else:
 			return listing.PageProperty(self, 'images', '', return_values = 'title')
 
-	def langlinks(self):
+	def langlinks(self, **kwargs):
 		self.site.require(1, 9)
-		return listing.PageProperty(self, 'langlinks', 'll', return_values = ('lang', '*'))
+		return listing.PageProperty(self, 'langlinks', 'll', return_values = ('lang', '*'), **kwargs)
 
-	def links(self, namespace = None, generator = True):
+	def links(self, namespace = None, generator = True, redirects = False):
 		self.site.require(1, 9)
 		kwargs = dict(listing.List.generate_kwargs('pl', namespace = namespace))
+		if redirects: kwargs['redirects'] = '1'
 		if generator:
-			return listing.PagePropertyGenerator(self, 'links', 'pl')
+			return listing.PagePropertyGenerator(self, 'links', 'pl', **kwargs)
 		else:
-			return listing.PageProperty(self, 'links', 'pl', return_values = 'title')
+			return listing.PageProperty(self, 'links', 'pl', return_values = 'title', **kwargs)
 
 	def revisions(self, startid = None, endid = None, start = None, end = None, 
 			dir = 'older', user = None, excludeuser = None, limit = 50, 
-			 prop = 'ids|timestamp|flags|comment|user', expandtemplates = False):
+			 prop = 'ids|timestamp|flags|comment|user', expandtemplates = False, section = None):
 		self.site.require(1, 8)
 		kwargs = dict(listing.List.generate_kwargs('rv', startid = startid, endid = endid,
 			start = start, end = end, user = user, excludeuser = excludeuser))
 		kwargs['rvdir'] = dir
 		kwargs['rvprop'] = prop
 		if expandtemplates: kwargs['rvexpandtemplates'] = '1'
+		if section: kwargs['rvsection'] = section
 		
 		return listing.RevisionsIterator(self, 'revisions', 'rv', limit = limit, **kwargs)