Index: include/libcss/properties.h
===================================================================
--- include/libcss/properties.h	(revision 12640)
+++ include/libcss/properties.h	(working copy)
@@ -488,6 +488,30 @@
 	CSS_PADDING_SET				= 0x1
 };
 
+enum css_page_break_after_e {
+	CSS_PAGE_BREAK_AFTER_INHERIT		= 0x0,
+	CSS_PAGE_BREAK_AFTER_AUTO		= 0x1,
+	CSS_PAGE_BREAK_AFTER_AVOID		= 0x2,
+	CSS_PAGE_BREAK_AFTER_ALWAYS		= 0x3,
+	CSS_PAGE_BREAK_AFTER_LEFT		= 0x4,
+	CSS_PAGE_BREAK_AFTER_RIGHT		= 0x5
+};	
+	
+enum css_page_break_before_e {
+	CSS_PAGE_BREAK_BEFORE_INHERIT		= CSS_PAGE_BREAK_AFTER_INHERIT,
+	CSS_PAGE_BREAK_BEFORE_AUTO		= CSS_PAGE_BREAK_AFTER_AUTO,
+	CSS_PAGE_BREAK_BEFORE_AVOID		= CSS_PAGE_BREAK_AFTER_AVOID,
+	CSS_PAGE_BREAK_BEFORE_ALWAYS		= CSS_PAGE_BREAK_AFTER_ALWAYS,
+	CSS_PAGE_BREAK_BEFORE_LEFT		= CSS_PAGE_BREAK_AFTER_LEFT,
+	CSS_PAGE_BREAK_BEFORE_RIGHT		= CSS_PAGE_BREAK_AFTER_RIGHT
+};
+
+enum css_page_break_inside_e {
+	CSS_PAGE_BREAK_INSIDE_INHERIT		= CSS_PAGE_BREAK_AFTER_INHERIT,
+	CSS_PAGE_BREAK_INSIDE_AUTO		= CSS_PAGE_BREAK_AFTER_AUTO,
+	CSS_PAGE_BREAK_INSIDE_AVOID		= CSS_PAGE_BREAK_AFTER_AVOID
+};
+
 enum css_position_e {
 	CSS_POSITION_INHERIT			= 0x0,
 	CSS_POSITION_STATIC			= 0x1,
Index: include/libcss/computed.h
===================================================================
--- include/libcss/computed.h	(revision 12640)
+++ include/libcss/computed.h	(working copy)
@@ -379,7 +379,16 @@
 uint8_t css_computed_text_align(
 		const css_computed_style *style);
 
+uint8_t css_computed_page_break_after(
+		const css_computed_style *style);
 
+uint8_t css_computed_page_break_before(
+		const css_computed_style *style);
+
+uint8_t css_computed_page_break_inside(
+		const css_computed_style *style);
+
+
 #ifdef __cplusplus
 }
 #endif
Index: src/select/computed.c
===================================================================
--- src/select/computed.c	(revision 12640)
+++ src/select/computed.c	(working copy)
@@ -2160,7 +2160,71 @@
 #undef CSS_TEXT_ALIGN_SHIFT
 #undef CSS_TEXT_ALIGN_INDEX
 
+#define CSS_PAGE_BREAK_AFTER_INDEX 0
+#define CSS_PAGE_BREAK_AFTER_SHIFT 0
+#define CSS_PAGE_BREAK_AFTER_MASK 0x7
+uint8_t css_computed_page_break_after(
+		const css_computed_style *style)
+{
+	if (style->page != NULL) {
+		uint8_t bits = style->page->bits[CSS_PAGE_BREAK_AFTER_INDEX];
+		bits &= CSS_PAGE_BREAK_AFTER_MASK;
+		bits >>= CSS_PAGE_BREAK_AFTER_SHIFT;
+	
+		/* 3bits: type */
+		return bits;
+	}
+    
+	return CSS_PAGE_BREAK_AFTER_AUTO;
+}
+#undef CSS_PAGE_BREAK_AFTER_MASK
+#undef CSS_PAGE_BREAK_AFTER_SHIFT
+#undef CSS_PAGE_BREAK_AFTER_INDEX
+ 
+#define CSS_PAGE_BREAK_BEFORE_INDEX 0
+#define CSS_PAGE_BREAK_BEFORE_SHIFT 3
+#define CSS_PAGE_BREAK_BEFORE_MASK 0x38
+uint8_t css_computed_page_break_before(
+		const css_computed_style *style)
+{
+	if (style->page != NULL) {
+		uint8_t bits = style->page->bits[CSS_PAGE_BREAK_BEFORE_INDEX];
+		bits &= CSS_PAGE_BREAK_BEFORE_MASK;
+		bits >>= CSS_PAGE_BREAK_BEFORE_SHIFT;
+	
+		/* 3bits: type */
+		return bits;
+	}
+    
+	return CSS_PAGE_BREAK_BEFORE_AUTO;
+}
+#undef CSS_PAGE_BREAK_BEFORE_MASK
+#undef CSS_PAGE_BREAK_BEFORE_SHIFT
+#undef CSS_PAGE_BREAK_BEFORE_INDEX
+    
+#define CSS_PAGE_BREAK_INSIDE_INDEX 0
+#define CSS_PAGE_BREAK_INSIDE_SHIFT 6
+#define CSS_PAGE_BREAK_INSIDE_MASK 0xc0
+uint8_t css_computed_page_break_inside(
+	    const css_computed_style *style)
+{
+	if (style->page != NULL) {
+		uint8_t bits = style->page->bits[CSS_PAGE_BREAK_INSIDE_INDEX];
+		bits &= CSS_PAGE_BREAK_INSIDE_MASK;
+		bits >>= CSS_PAGE_BREAK_INSIDE_SHIFT;
+	
+		/* 2bits: type */
+		return bits;
+	}
+    
+	return CSS_PAGE_BREAK_INSIDE_AUTO;
+}
+#undef CSS_PAGE_BREAK_INSIDE_MASK
+#undef CSS_PAGE_BREAK_INSIDE_SHIFT
+#undef CSS_PAGE_BREAK_INSIDE_INDEX
 
+
+
 /******************************************************************************
  * Library internals                                                          *
  ******************************************************************************/
Index: src/select/propset.h
===================================================================
--- src/select/propset.h	(revision 12640)
+++ src/select/propset.h	(working copy)
@@ -51,6 +51,25 @@
 	}								\
 } while(0)
 
+static const css_computed_page default_page = {
+    { (CSS_PAGE_BREAK_INSIDE_AUTO <<  6) | 
+        	(CSS_PAGE_BREAK_BEFORE_AUTO << 3) |
+        	CSS_PAGE_BREAK_AFTER_AUTO
+    }
+};
+
+#define ENSURE_PAGE do {						\
+	if (style->page == NULL) {					\
+		style->page = style->alloc(NULL, 			\
+			sizeof(css_computed_page), style->pw);		\
+		if (style->page == NULL)				\
+			return CSS_NOMEM;				\
+									\
+		memcpy(style->page, &default_page,			\
+				sizeof(css_computed_page));		\
+	}								\
+} while(0)
+
 #define LETTER_SPACING_INDEX 0
 #define LETTER_SPACING_SHIFT 2
 #define LETTER_SPACING_MASK  0xfc
@@ -1835,4 +1854,54 @@
 #undef TEXT_ALIGN_SHIFT
 #undef TEXT_ALIGN_INDEX
 
+#define PAGE_BREAK_AFTER_INDEX 0
+#define PAGE_BREAK_AFTER_SHIFT 0
+#define PAGE_BREAK_AFTER_MASK 0x7
+static inline css_error set_page_break_after(
+		css_computed_style *style, uint8_t type)
+{
+	ENSURE_PAGE;
+	uint8_t *bits = &style->page->bits[PAGE_BREAK_AFTER_INDEX];
+	/* 3bits: type */
+	*bits = (*bits & ~PAGE_BREAK_AFTER_MASK) |
+			((type & 0xf) << PAGE_BREAK_AFTER_SHIFT);
+	return CSS_OK;
+}
+#undef PAGE_BREAK_AFTER_INDEX
+#undef PAGE_BREAK_AFTER_SHIFT
+#undef PAGE_BREAK_AFTER_MASK
+#define PAGE_BREAK_BEFORE_INDEX 0
+#define PAGE_BREAK_BEFORE_SHIFT 3
+#define PAGE_BREAK_BEFORE_MASK 0x38
+static inline css_error set_page_break_before(
+		css_computed_style *style, uint8_t type)
+{
+	ENSURE_PAGE;
+	
+	uint8_t *bits = &style->page->bits[PAGE_BREAK_BEFORE_INDEX];
+	/* 3bits: type */
+	*bits = (*bits & ~PAGE_BREAK_BEFORE_MASK) |
+			((type & 0xf) << PAGE_BREAK_BEFORE_SHIFT);
+	return CSS_OK;
+}
+#undef PAGE_BREAK_BEFORE_INDEX
+#undef PAGE_BREAK_BEFORE_SHIFT
+#undef PAGE_BREAK_BEFORE_MASK
+#define PAGE_BREAK_INSIDE_INDEX 0
+#define PAGE_BREAK_INSIDE_SHIFT 6
+#define PAGE_BREAK_INSIDE_MASK 0xc0
+static inline css_error set_page_break_inside(
+		css_computed_style *style, uint8_t type)
+{
+	ENSURE_PAGE;
+	uint8_t *bits = &style->page->bits[PAGE_BREAK_INSIDE_INDEX];
+	/* 2bits: type */
+	*bits = (*bits & ~PAGE_BREAK_INSIDE_MASK) |
+			((type & 0xf) << PAGE_BREAK_INSIDE_SHIFT);
+	return CSS_OK;
+}
+#undef PAGE_BREAK_INSIDE_INDEX
+#undef PAGE_BREAK_INSIDE_SHIFT
+#undef PAGE_BREAK_INSIDE_MASK
+
 #endif
Index: src/select/computed.h
===================================================================
--- src/select/computed.h	(revision 12640)
+++ src/select/computed.h	(working copy)
@@ -85,6 +85,17 @@
 	css_computed_content_item *content;
 } css_computed_uncommon;
 
+typedef struct css_computed_page {
+/*
+ * page_break_after		  3
+ * page_break_before		  3
+ * page_break_inside		  2
+ * 				---
+ *				  8 bits
+ */
+    uint8_t bits[1];
+} css_computed_page;
+    
 struct css_computed_style {
 /*
  * background_attachment	  2
@@ -270,7 +281,7 @@
 
 	css_computed_uncommon *uncommon;/**< Uncommon properties */
 	void *aural;			/**< Aural properties */
-	void *page;			/**< Page properties */
+	css_computed_page *page;	/**< Page properties */
 
 	css_allocator_fn alloc;
 	void *pw;
Index: src/select/propget.h
===================================================================
--- src/select/propget.h	(revision 12640)
+++ src/select/propget.h	(working copy)
@@ -1744,4 +1744,67 @@
 #undef TEXT_ALIGN_SHIFT
 #undef TEXT_ALIGN_INDEX
 
+#define PAGE_BREAK_AFTER_INDEX 0
+#define PAGE_BREAK_AFTER_SHIFT 0
+#define PAGE_BREAK_AFTER_MASK 0x7
+static inline uint8_t get_page_break_after(
+		const css_computed_style *style)
+{
+	if (style->page != NULL) {
+		uint8_t bits = style->page->bits[PAGE_BREAK_AFTER_INDEX];
+		bits &= PAGE_BREAK_AFTER_MASK;
+		bits >>= PAGE_BREAK_AFTER_SHIFT;
+
+		/* 3bits: type */
+		return bits;
+	}
+
+	return CSS_PAGE_BREAK_AFTER_AUTO;
+}
+#undef PAGE_BREAK_AFTER_MASK
+#undef PAGE_BREAK_AFTER_SHIFT
+#undef PAGE_BREAK_AFTER_INDEX
+ 
+#define PAGE_BREAK_BEFORE_INDEX 0
+#define PAGE_BREAK_BEFORE_SHIFT 3
+#define PAGE_BREAK_BEFORE_MASK 0x38
+static inline uint8_t get_page_break_before(
+		const css_computed_style *style)
+{
+	if (style->page != NULL) {
+		uint8_t bits = style->page->bits[PAGE_BREAK_BEFORE_INDEX];
+		bits &= PAGE_BREAK_BEFORE_MASK;
+		bits >>= PAGE_BREAK_BEFORE_SHIFT;
+
+		/* 3bits: type */
+		return bits;
+	}
+    
+	return CSS_PAGE_BREAK_BEFORE_AUTO;
+}
+#undef PAGE_BREAK_BEFORE_MASK
+#undef PAGE_BREAK_BEFORE_SHIFT
+#undef PAGE_BREAK_BEFORE_INDEX
+    
+#define PAGE_BREAK_INSIDE_INDEX 0
+#define PAGE_BREAK_INSIDE_SHIFT 6
+#define PAGE_BREAK_INSIDE_MASK 0xc0
+static inline uint8_t get_page_break_inside(
+	    const css_computed_style *style)
+{
+	if (style->page != NULL) {
+		uint8_t bits = style->page->bits[PAGE_BREAK_INSIDE_INDEX];
+		bits &= PAGE_BREAK_INSIDE_MASK;
+		bits >>= PAGE_BREAK_INSIDE_SHIFT;
+
+		/* 2bits: type */
+		return bits;
+	}
+
+	return CSS_PAGE_BREAK_INSIDE_AUTO;
+}
+#undef PAGE_BREAK_INSIDE_MASK
+#undef PAGE_BREAK_INSIDE_SHIFT
+#undef PAGE_BREAK_INSIDE_INDEX
+
 #endif
Index: src/select/properties/page_break_after.c
===================================================================
--- src/select/properties/page_break_after.c	(revision 12640)
+++ src/select/properties/page_break_after.c	(working copy)
@@ -17,34 +17,32 @@
 css_error css__cascade_page_break_after(uint32_t opv, css_style *style, 
 		css_select_state *state)
 {
-	/** \todo page-break-after */
-	return css__cascade_page_break_after_before(opv, style, state, NULL);
+	return css__cascade_page_break_after_before_inside(opv, style, state,
+		set_page_break_after);
 }
 
 css_error css__set_page_break_after_from_hint(const css_hint *hint,
 		css_computed_style *style)
 {
-	UNUSED(hint);
-	UNUSED(style);
-
-	return CSS_OK;
+	return set_page_break_after(style, hint->status);
 }
 
 css_error css__initial_page_break_after(css_select_state *state)
 {
-	UNUSED(state);
-
-	return CSS_OK;
+	return set_page_break_after(state->computed,
+		CSS_PAGE_BREAK_AFTER_AUTO);
 }
 
 css_error css__compose_page_break_after(const css_computed_style *parent,
 		const css_computed_style *child,
 		css_computed_style *result)
 {
-	UNUSED(parent);
-	UNUSED(child);
-	UNUSED(result);
+	uint8_t type = get_page_break_after(child);
 
-	return CSS_OK;
+	if (type == CSS_PAGE_BREAK_AFTER_INHERIT) {
+		type = get_page_break_after(parent);
+	}
+
+	return set_page_break_after(result, type);
 }
 
Index: src/select/properties/helpers.c
===================================================================
--- src/select/properties/helpers.c	(revision 12640)
+++ src/select/properties/helpers.c	(working copy)
@@ -356,22 +356,30 @@
 	return CSS_OK;
 }
 
-css_error css__cascade_page_break_after_before(uint32_t opv, css_style *style,
-		css_select_state *state,
+css_error css__cascade_page_break_after_before_inside(uint32_t opv, 
+		css_style *style, css_select_state *state,
 		css_error (*fun)(css_computed_style *, uint8_t))
 {
-	uint16_t value = 0;
+	uint16_t value = CSS_PAGE_BREAK_AFTER_INHERIT;
 
 	UNUSED(style);
 
 	if (isInherit(opv) == false) {
 		switch (getValue(opv)) {
 		case PAGE_BREAK_AFTER_AUTO:
+			value = CSS_PAGE_BREAK_AFTER_AUTO;
+			break;
 		case PAGE_BREAK_AFTER_ALWAYS:
+			value = CSS_PAGE_BREAK_AFTER_ALWAYS;
+			break;
 		case PAGE_BREAK_AFTER_AVOID:
+			value = CSS_PAGE_BREAK_AFTER_AVOID;
+			break;
 		case PAGE_BREAK_AFTER_LEFT:
+			value = CSS_PAGE_BREAK_AFTER_LEFT;
+			break;
 		case PAGE_BREAK_AFTER_RIGHT:
-			/** \todo convert to public values */
+			value = CSS_PAGE_BREAK_AFTER_RIGHT;
 			break;
 		}
 	}
Index: src/select/properties/helpers.h
===================================================================
--- src/select/properties/helpers.h	(revision 12640)
+++ src/select/properties/helpers.h	(working copy)
@@ -48,8 +48,8 @@
 css_error css__cascade_number(uint32_t opv, css_style *style,
 		css_select_state *state,
 		css_error (*fun)(css_computed_style *, uint8_t, css_fixed));
-css_error css__cascade_page_break_after_before(uint32_t opv, css_style *style,
-		css_select_state *state,
+css_error css__cascade_page_break_after_before_inside(uint32_t opv, 
+		css_style *style, css_select_state *state,
 		css_error (*fun)(css_computed_style *, uint8_t));
 css_error css__cascade_counter_increment_reset(uint32_t opv, css_style *style,
 		css_select_state *state,
Index: src/select/properties/page_break_inside.c
===================================================================
--- src/select/properties/page_break_inside.c	(revision 12640)
+++ src/select/properties/page_break_inside.c	(working copy)
@@ -17,49 +17,32 @@
 css_error css__cascade_page_break_inside(uint32_t opv, css_style *style, 
 		css_select_state *state)
 {
-	UNUSED(style);
-
-	if (isInherit(opv) == false) {
-		switch (getValue(opv)) {
-		case PAGE_BREAK_INSIDE_AUTO:
-		case PAGE_BREAK_INSIDE_AVOID:
-			/** \todo convert to public values */
-			break;
-		}
-	}
-
-	if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
-			isInherit(opv))) {
-		/** \todo page-break-inside */
-	}
-
-	return CSS_OK;
+	return css__cascade_page_break_after_before_inside(opv, style, state, 
+		set_page_break_inside);
 }
 
 css_error css__set_page_break_inside_from_hint(const css_hint *hint,
 		css_computed_style *style)
 {
-	UNUSED(hint);
-	UNUSED(style);
-
-	return CSS_OK;
+	return set_page_break_inside(style, hint->status);
 }
 
 css_error css__initial_page_break_inside(css_select_state *state)
 {
-	UNUSED(state);
-
-	return CSS_OK;
+	return set_page_break_inside(state->computed,
+		CSS_PAGE_BREAK_INSIDE_AUTO);
 }
 
 css_error css__compose_page_break_inside(const css_computed_style *parent,
 		const css_computed_style *child,
 		css_computed_style *result)
 {
-	UNUSED(parent);
-	UNUSED(child);
-	UNUSED(result);
-
-	return CSS_OK;
+	uint8_t type = get_page_break_inside(child);
+   
+	if (type == CSS_PAGE_BREAK_INSIDE_INHERIT) {
+		type = get_page_break_inside(parent);
+	}
+   
+	return set_page_break_inside(result, type);
 }
 
Index: src/select/properties/page_break_before.c
===================================================================
--- src/select/properties/page_break_before.c	(revision 12640)
+++ src/select/properties/page_break_before.c	(working copy)
@@ -17,34 +17,31 @@
 css_error css__cascade_page_break_before(uint32_t opv, css_style *style, 
 		css_select_state *state)
 {
-	/** \todo page-break-before */
-	return css__cascade_page_break_after_before(opv, style, state, NULL);
+	return css__cascade_page_break_after_before_inside(opv, style, state, 
+		set_page_break_before);
 }
 
 css_error css__set_page_break_before_from_hint(const css_hint *hint,
 		css_computed_style *style)
 {
-	UNUSED(hint);
-	UNUSED(style);
-
-	return CSS_OK;
+	return set_page_break_before(style, hint->status);
 }
 
 css_error css__initial_page_break_before(css_select_state *state)
 {
-	UNUSED(state);
-
-	return CSS_OK;
+	return set_page_break_before(state->computed, 
+    		CSS_PAGE_BREAK_BEFORE_AUTO);
 }
 
 css_error css__compose_page_break_before(const css_computed_style *parent,
 		const css_computed_style *child,
 		css_computed_style *result)
 {
-	UNUSED(parent);
-	UNUSED(child);
-	UNUSED(result);
-
-	return CSS_OK;
+	uint8_t type = get_page_break_before(child);
+    
+	if (type == CSS_PAGE_BREAK_BEFORE_INHERIT) {
+		type = get_page_break_before(parent);
+	}
+    
+	return set_page_break_before(result, type);
 }
-
