diff --git a/lib/src/abstract/Lang.gf b/lib/src/abstract/Lang.gf
index 8498984ed..1a1866e98 100644
--- a/lib/src/abstract/Lang.gf
+++ b/lib/src/abstract/Lang.gf
@@ -10,6 +10,7 @@ abstract Lang =
Lexicon
,Construction --- could be compiled here, but not in concretes, as they call Syntax and Grammar
,Documentation
+ ,Markup
** {
flags startcat=Phr ;
} ;
diff --git a/lib/src/abstract/MarkHTML.gf b/lib/src/abstract/MarkHTML.gf
new file mode 100644
index 000000000..791281cb0
--- /dev/null
+++ b/lib/src/abstract/MarkHTML.gf
@@ -0,0 +1,25 @@
+abstract MarkHTML = {
+
+-- HTML markup to be used in Markup.gf. Will have a common implementation for all languages.
+-- AR 11/2/2014
+
+cat
+ Mark ;
+
+fun
+ i_Mark : Mark ;
+ b_Mark : Mark ;
+ ul_Mark : Mark ;
+ li_Mark : Mark ;
+ h1_Mark : Mark ;
+ h2_Mark : Mark ;
+ table_Mark : Mark ;
+ tr_Mark : Mark ;
+ td_Mark : Mark ;
+ p_Mark : Mark ;
+
+ a_Mark : String -> Mark ;
+
+ stringMark : String -> String -> Mark ; -- make your own markup
+
+}
\ No newline at end of file
diff --git a/lib/src/abstract/Markup.gf b/lib/src/abstract/Markup.gf
new file mode 100644
index 000000000..9ef55b336
--- /dev/null
+++ b/lib/src/abstract/Markup.gf
@@ -0,0 +1,20 @@
+abstract Markup = Cat, MarkHTML ** {
+
+-- Adding markup to sentences and their parts. By default both start and end tags.
+-- For instance
+--
+-- MarkupNP boldMarkup everything_NP ==> everything
+--
+-- AR 11/2/2014
+
+fun
+ MarkupCN : Mark -> CN -> CN ;
+ MarkupNP : Mark -> NP -> NP ;
+ MarkupAP : Mark -> AP -> AP ;
+ MarkupAdv : Mark -> Adv -> Adv ;
+ MarkupS : Mark -> S -> S ;
+ MarkupUtt : Mark -> Utt -> Utt ;
+ MarkupPhr : Mark -> Phr -> Phr ;
+ MarkupText : Mark -> Text -> Text ;
+
+}
\ No newline at end of file
diff --git a/lib/src/common/MarkHTMLX.gf b/lib/src/common/MarkHTMLX.gf
new file mode 100644
index 000000000..8f4a48a4c
--- /dev/null
+++ b/lib/src/common/MarkHTMLX.gf
@@ -0,0 +1,35 @@
+--# -path=.:../abstract
+
+concrete MarkHTMLX of MarkHTML = open HTML, Prelude in {
+
+lincat
+ Mark = {begin,end : Str} ;
+
+lin
+ i_Mark = mkMark "i" ;
+ b_Mark = mkMark "b" ;
+ ul_Mark = mkMark "ul" ;
+ li_Mark = mkMark "li" ;
+ h1_Mark = mkMark "h1" ;
+ h2_Mark = mkMark "h2" ;
+ table_Mark = mkMark "table" ;
+ tr_Mark = mkMark "tr" ;
+ td_Mark = mkMark "td" ;
+ p_Mark = mkMark "p" ;
+
+ a_Mark url = {begin = "" ; end = ""} ;
+
+ stringMark begin end = {begin = begin.s ; end = end.s} ;
+
+oper
+ mkMark = overload {
+ mkMark : Str -> Mark
+ = \s -> lin Mark {begin = tag s ; end = endtag s} ;
+ mkMark : Str -> Str -> Mark
+ = \s,t -> lin Mark {begin = tag s ; end = endtag t} ;
+ } ;
+
+ appMark : {begin,end : Str} -> Str -> Str
+ = \m,s -> m.begin ++ s ++ m.end ;
+
+}
\ No newline at end of file
diff --git a/lib/src/english/LangEng.gf b/lib/src/english/LangEng.gf
index 6533caf4a..47059fa08 100644
--- a/lib/src/english/LangEng.gf
+++ b/lib/src/english/LangEng.gf
@@ -5,6 +5,7 @@ concrete LangEng of Lang =
LexiconEng
,ConstructionEng
,DocumentationEng
+ ,MarkupEng
** {
flags startcat = Phr ; unlexer = text ; lexer = text ;
diff --git a/lib/src/english/MarkupEng.gf b/lib/src/english/MarkupEng.gf
new file mode 100644
index 000000000..505db7a75
--- /dev/null
+++ b/lib/src/english/MarkupEng.gf
@@ -0,0 +1,15 @@
+--# -path=.:../abstract:../common
+
+concrete MarkupEng of Markup = CatEng, MarkHTMLX ** {
+
+lin
+ MarkupCN m cn = {s = \\n,c => appMark m (cn.s ! n ! c) ; g = cn.g} ;
+ MarkupNP m np = {s = \\c => appMark m (np.s ! c) ; a = np.a} ;
+ MarkupAP m ap = {s = \\a => appMark m (ap.s ! a) ; isPre = ap.isPre} ;
+ MarkupAdv m adv = {s = appMark m adv.s} ;
+ MarkupS m s = {s = appMark m s.s} ;
+ MarkupUtt m utt = {s = appMark m utt.s} ;
+ MarkupPhr m phr = {s = appMark m phr.s} ;
+ MarkupText m txt = {s = appMark m txt.s} ;
+
+}
\ No newline at end of file
diff --git a/lib/src/prelude/HTML.gf b/lib/src/prelude/HTML.gf
index 1a58415f9..1387018fc 100644
--- a/lib/src/prelude/HTML.gf
+++ b/lib/src/prelude/HTML.gf
@@ -1,4 +1,5 @@
resource HTML = open Prelude in {
+
oper
tag : Str -> Str = \t -> "<" + t + ">" ;
endtag : Str -> Str = \t -> tag ("/" + t) ;
diff --git a/lib/src/scandinavian/MarkupScand.gf b/lib/src/scandinavian/MarkupScand.gf
new file mode 100644
index 000000000..1372444e5
--- /dev/null
+++ b/lib/src/scandinavian/MarkupScand.gf
@@ -0,0 +1,13 @@
+incomplete concrete MarkupScand of Markup = CatScand, MarkHTMLX ** open ResScand in {
+
+lin
+ MarkupCN m cn = {s = \\n,d,c => appMark m (cn.s ! n ! d ! c) ; g = cn.g ; isMod = cn.isMod} ;
+ MarkupNP m np = {s = \\c => appMark m (np.s ! c) ; a = np.a} ;
+ MarkupAP m ap = {s = \\a => appMark m (ap.s ! a) ; isPre = ap.isPre} ;
+ MarkupAdv m adv = {s = appMark m adv.s} ;
+ MarkupS m s = {s = \\o => appMark m (s.s ! o)} ;
+ MarkupUtt m utt = {s = appMark m utt.s} ;
+ MarkupPhr m phr = {s = appMark m phr.s} ;
+ MarkupText m txt = {s = appMark m txt.s} ;
+
+}
\ No newline at end of file
diff --git a/lib/src/swedish/LangSwe.gf b/lib/src/swedish/LangSwe.gf
index aa29960e3..ff26a0185 100644
--- a/lib/src/swedish/LangSwe.gf
+++ b/lib/src/swedish/LangSwe.gf
@@ -5,6 +5,7 @@ concrete LangSwe of Lang =
LexiconSwe
,ConstructionSwe
,DocumentationSwe
+ ,MarkupSwe
** {
flags startcat = Phr ; unlexer = text ; lexer = text ;
diff --git a/lib/src/swedish/MarkupSwe.gf b/lib/src/swedish/MarkupSwe.gf
new file mode 100644
index 000000000..75d4fa127
--- /dev/null
+++ b/lib/src/swedish/MarkupSwe.gf
@@ -0,0 +1,3 @@
+--# -path=.:../abstract:../common:../scandinavian
+
+concrete MarkupSwe of Markup = CatSwe, MarkHTMLX ** MarkupScand with (ResScand = ResSwe) ;
\ No newline at end of file