diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..daf913b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,24 @@
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+*.test
+*.prof
diff --git a/README.md b/README.md
index a7a5e56..6b2494e 100644
--- a/README.md
+++ b/README.md
@@ -4,14 +4,14 @@
 [![Build Status](https://travis-ci.org/jaytaylor/html2text.svg?branch=master)](https://travis-ci.org/jaytaylor/html2text)
 [![Report Card](https://goreportcard.com/badge/github.com/jaytaylor/html2text)](https://goreportcard.com/report/github.com/jaytaylor/html2text)
 
-### Converts HTML into text
+### Converts HTML into text of the markdown-flavored variety
 
 
 ## Introduction
 
 Ensure your emails are readable by all!
 
-Turns HTML into raw text, useful for sending fancy HTML emails with a equivalently nicely formatted TXT document as a fallback (e.g. for people who don't allow HTML emails or have other display issues).
+Turns HTML into raw text, useful for sending fancy HTML emails with an equivalently nicely formatted TXT document as a fallback (e.g. for people who don't allow HTML emails or have other display issues).
 
 html2text is a simple golang package for rendering HTML into plaintext.
 
@@ -23,7 +23,7 @@ It requires go 1.x or newer ;)
 ## Download the package
 
 ```bash
-go get github.com/jaytaylor/html2text
+go get jaytaylor.com/html2text
 ```
 
 ## Example usage
@@ -34,7 +34,7 @@ package main
 import (
 	"fmt"
 
-	"github.com/jaytaylor/html2text"
+	"jaytaylor.com/html2text"
 )
 
 func main() {
@@ -78,7 +78,7 @@ func main() {
   </body>
 </html>`
 
-	text, err := FromString(inputHTML, Options{PrettyTables: true})
+	text, err := html2text.FromString(inputHTML, html2text.Options{PrettyTables: true})
 	if err != nil {
 		panic(err)
 	}
diff --git a/debian/changelog b/debian/changelog
index 66f35a9..db228fe 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,4 +1,4 @@
-golang-github-jaytaylor-html2text (0.0~git20170918.0.0ee88d3-5) UNRELEASED; urgency=medium
+golang-github-jaytaylor-html2text (0.0~git20190408.0.01ec452-1) UNRELEASED; urgency=medium
 
   [ Alexandre Viau ]
   * Point Vcs-* urls to salsa.debian.org.
@@ -6,7 +6,10 @@ golang-github-jaytaylor-html2text (0.0~git20170918.0.0ee88d3-5) UNRELEASED; urge
   [ Jelmer Vernooń≥ ]
   * Fix Debian QA group name.
 
- -- Alexandre Viau <aviau@debian.org>  Mon, 02 Apr 2018 18:15:00 -0400
+  [ Debian Janitor ]
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Mon, 19 Aug 2019 10:42:34 +0000
 
 golang-github-jaytaylor-html2text (0.0~git20170918.0.0ee88d3-4) unstable; urgency=medium
 
diff --git a/html2text.go b/html2text.go
index baaa460..4398909 100644
--- a/html2text.go
+++ b/html2text.go
@@ -15,7 +15,51 @@ import (
 
 // Options provide toggles and overrides to control specific rendering behaviors.
 type Options struct {
-	PrettyTables bool // Turns on pretty ASCII rendering for table elements.
+	PrettyTables        bool                 // Turns on pretty ASCII rendering for table elements.
+	PrettyTablesOptions *PrettyTablesOptions // Configures pretty ASCII rendering for table elements.
+	OmitLinks           bool                 // Turns on omitting links
+}
+
+// PrettyTablesOptions overrides tablewriter behaviors
+type PrettyTablesOptions struct {
+	AutoFormatHeader     bool
+	AutoWrapText         bool
+	ReflowDuringAutoWrap bool
+	ColWidth             int
+	ColumnSeparator      string
+	RowSeparator         string
+	CenterSeparator      string
+	HeaderAlignment      int
+	FooterAlignment      int
+	Alignment            int
+	ColumnAlignment      []int
+	NewLine              string
+	HeaderLine           bool
+	RowLine              bool
+	AutoMergeCells       bool
+	Borders              tablewriter.Border
+}
+
+// NewPrettyTablesOptions creates PrettyTablesOptions with default settings
+func NewPrettyTablesOptions() *PrettyTablesOptions {
+	return &PrettyTablesOptions{
+		AutoFormatHeader:     true,
+		AutoWrapText:         true,
+		ReflowDuringAutoWrap: true,
+		ColWidth:             tablewriter.MAX_ROW_WIDTH,
+		ColumnSeparator:      tablewriter.COLUMN,
+		RowSeparator:         tablewriter.ROW,
+		CenterSeparator:      tablewriter.CENTER,
+		HeaderAlignment:      tablewriter.ALIGN_DEFAULT,
+		FooterAlignment:      tablewriter.ALIGN_DEFAULT,
+		Alignment:            tablewriter.ALIGN_DEFAULT,
+		ColumnAlignment:      []int{},
+		NewLine:              tablewriter.NEWLINE,
+		HeaderLine:           true,
+		RowLine:              false,
+		AutoMergeCells:       false,
+		Borders:              tablewriter.Border{Left: true, Right: true, Bottom: true, Top: true},
+	}
 }
 
 // FromHTMLNode renders text output from a pre-parsed HTML document.
@@ -79,6 +123,7 @@ type textifyTraverseContext struct {
 	justClosedDiv   bool
 	blockquoteLevel int
 	lineLength      int
+	isPre           bool
 }
 
 // tableTraverseContext holds table ASCII-form related context.
@@ -209,7 +254,7 @@ func (ctx *textifyTraverseContext) handleElement(node *html.Node) error {
 		if attrVal := getAttrVal(node, "href"); attrVal != "" {
 			attrVal = ctx.normalizeHrefLink(attrVal)
 			// Don't print link href if it matches link element content or if the link is empty.
-			if attrVal != "" && linkText != attrVal {
+			if !ctx.options.OmitLinks && attrVal != "" && linkText != attrVal {
 				hrefLink = "( " + attrVal + " )"
 			}
 		}
@@ -227,6 +272,12 @@ func (ctx *textifyTraverseContext) handleElement(node *html.Node) error {
 		}
 		return ctx.traverseChildren(node)
 
+	case atom.Pre:
+		ctx.isPre = true
+		err := ctx.traverseChildren(node)
+		ctx.isPre = false
+		return err
+
 	case atom.Style, atom.Script, atom.Head:
 		// Ignore the subtree.
 		return nil
@@ -269,6 +320,25 @@ func (ctx *textifyTraverseContext) handleTableElement(node *html.Node) error {
 
 		buf := &bytes.Buffer{}
 		table := tablewriter.NewWriter(buf)
+		if ctx.options.PrettyTablesOptions != nil {
+			options := ctx.options.PrettyTablesOptions
+			table.SetAutoFormatHeaders(options.AutoFormatHeader)
+			table.SetAutoWrapText(options.AutoWrapText)
+			table.SetReflowDuringAutoWrap(options.ReflowDuringAutoWrap)
+			table.SetColWidth(options.ColWidth)
+			table.SetColumnSeparator(options.ColumnSeparator)
+			table.SetRowSeparator(options.RowSeparator)
+			table.SetCenterSeparator(options.CenterSeparator)
+			table.SetHeaderAlignment(options.HeaderAlignment)
+			table.SetFooterAlignment(options.FooterAlignment)
+			table.SetAlignment(options.Alignment)
+			table.SetColumnAlignment(options.ColumnAlignment)
+			table.SetNewLine(options.NewLine)
+			table.SetHeaderLine(options.HeaderLine)
+			table.SetRowLine(options.RowLine)
+			table.SetAutoMergeCells(options.AutoMergeCells)
+			table.SetBorders(options.Borders)
+		}
 		table.SetHeader(ctx.tableCtx.header)
 		table.SetFooter(ctx.tableCtx.footer)
 		table.AppendBulk(ctx.tableCtx.body)
@@ -325,7 +395,12 @@ func (ctx *textifyTraverseContext) traverse(node *html.Node) error {
 		return ctx.traverseChildren(node)
 
 	case html.TextNode:
-		data := strings.Trim(spacingRe.ReplaceAllString(node.Data, " "), " ")
+		var data string
+		if ctx.isPre {
+			data = node.Data
+		} else {
+			data = strings.TrimSpace(spacingRe.ReplaceAllString(node.Data, " "))
+		}
 		return ctx.emit(data)
 
 	case html.ElementNode:
diff --git a/html2text_test.go b/html2text_test.go
index 410cb22..452b45e 100644
--- a/html2text_test.go
+++ b/html2text_test.go
@@ -139,6 +139,10 @@ func TestParagraphsAndBreaks(t *testing.T) {
 			"Test text<br><BR />Test text",
 			"Test text\n\nTest text",
 		},
+		{
+			"<pre>test1\ntest 2\n\ntest  3</pre>",
+			"test1\ntest 2\n\ntest  3",
+		},
 	}
 
 	for _, testCase := range testCases {
@@ -185,21 +189,21 @@ func TestTables(t *testing.T) {
 		{
 			`<table>
 				<tbody>
-					<tr><td><p>Row-1-Col-1-Msg1</p><p>Row-1-Col-1-Msg2</p></td><td>Row-1-Col-2</td></tr>
+					<tr><td><p>Row-1-Col-1-Msg123456789012345</p><p>Row-1-Col-1-Msg2</p></td><td>Row-1-Col-2</td></tr>
 					<tr><td>Row-2-Col-1</td><td>Row-2-Col-2</td></tr>
 				</tbody>
 			</table>`,
 			// +--------------------------------+-------------+
-			// | Row-1-Col-1-Msg1               | Row-1-Col-2 |
+			// | Row-1-Col-1-Msg123456789012345 | Row-1-Col-2 |
 			// | Row-1-Col-1-Msg2               |             |
 			// | Row-2-Col-1                    | Row-2-Col-2 |
 			// +--------------------------------+-------------+
 			`+--------------------------------+-------------+
-| Row-1-Col-1-Msg1               | Row-1-Col-2 |
+| Row-1-Col-1-Msg123456789012345 | Row-1-Col-2 |
 | Row-1-Col-1-Msg2               |             |
 | Row-2-Col-1                    | Row-2-Col-2 |
 +--------------------------------+-------------+`,
-			`Row-1-Col-1-Msg1
+			`Row-1-Col-1-Msg123456789012345
 
 Row-1-Col-1-Msg2
 
@@ -241,7 +245,7 @@ Row-1-Col-2 Row-2-Col-1 Row-2-Col-2`,
 			"Header 1 Header 2 Footer 1 Footer 2 Row 1 Col 1 Row 1 Col 2 Row 2 Col 1 Row 2 Col 2",
 		},
 		// Two tables in same HTML (goal is to test that context is
-		// reinitalized correctly).
+		// reinitialized correctly).
 		{
 			`<p>
 				<table>
@@ -330,7 +334,8 @@ Table 2 Header 1 Table 2 Header 2 Table 2 Footer 1 Table 2 Footer 2 Table 2 Row
 
 	for _, testCase := range testCases {
 		options := Options{
-			PrettyTables: true,
+			PrettyTables:        true,
+			PrettyTablesOptions: NewPrettyTablesOptions(),
 		}
 		// Check pretty tabular ASCII version.
 		if msg, err := wantString(testCase.input, testCase.tabularOutput, options); err != nil {
@@ -468,6 +473,54 @@ func TestLinks(t *testing.T) {
 	}
 }
 
+func TestOmitLinks(t *testing.T) {
+	testCases := []struct {
+		input  string
+		output string
+	}{
+		{
+			`<a></a>`,
+			``,
+		},
+		{
+			`<a href=""></a>`,
+			``,
+		},
+		{
+			`<a href="http://example.com/"></a>`,
+			``,
+		},
+		{
+			`<a href="">Link</a>`,
+			`Link`,
+		},
+		{
+			`<a href="http://example.com/">Link</a>`,
+			`Link`,
+		},
+		{
+			`<a href="http://example.com/"><span class="a">Link</span></a>`,
+			`Link`,
+		},
+		{
+			"<a href='http://example.com/'>\n\t<span class='a'>Link</span>\n\t</a>",
+			`Link`,
+		},
+		{
+			`<a href="http://example.com/"><img src="http://example.ru/hello.jpg" alt="Example"></a>`,
+			`Example`,
+		},
+	}
+
+	for _, testCase := range testCases {
+		if msg, err := wantString(testCase.input, testCase.output, Options{OmitLinks: true}); err != nil {
+			t.Error(err)
+		} else if len(msg) > 0 {
+			t.Log(msg)
+		}
+	}
+}
+
 func TestImageAltTags(t *testing.T) {
 	testCases := []struct {
 		input  string
@@ -616,6 +669,10 @@ func TestDiv(t *testing.T) {
 			"Test 1<div>Test 2</div> <div>Test 3</div>Test 4",
 			"Test 1\nTest 2\nTest 3\nTest 4",
 		},
+		{
+			"Test 1<div>&nbsp;Test 2&nbsp;</div>",
+			"Test 1\nTest 2",
+		},
 	}
 
 	for _, testCase := range testCases {
@@ -744,7 +801,7 @@ func TestText(t *testing.T) {
 			`hi
 
 			<br>
-	
+
 	hello <a href="https://google.com">google</a>
 	<br><br>
 	test<p>List:</p>