Internet DRAFT - draft-hartke-core-coap-xmpp
draft-hartke-core-coap-xmpp
CoRE Working Group K. Hartke
Internet-Draft Universitaet Bremen TZI
Intended status: Experimental January 31, 2012
Expires: August 3, 2012
A CoAP REST API for XMPP Publish-Subscribe
draft-hartke-core-coap-xmpp-00
Abstract
The REST API defined in this document enables Constrained Application
Protocol (CoAP) clients to interact with Extensible Messaging
Protocol (XMPP) Publish-Subscribe services by delegating the task of
creating, retrieving, updating and deleting pubsub items and nodes to
a CoAP/XMPP proxy.
Status of this Memo
This Internet-Draft is submitted in full conformance with the
provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet-
Drafts is at http://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."
This Internet-Draft will expire on August 3, 2012.
Copyright Notice
Copyright (c) 2012 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents
(http://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents
carefully, as they describe your rights and restrictions with respect
to this document. Code Components extracted from this document must
include Simplified BSD License text as described in Section 4.e of
the Trust Legal Provisions and are provided without warranty as
described in the Simplified BSD License.
Hartke Expires August 3, 2012 [Page 1]
Internet-Draft CoAP REST API for XMPP PubSub January 2012
Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3
2. Protocol and Scheme . . . . . . . . . . . . . . . . . . . . . 3
2.1. Node URI . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2. Node Meta-Data URI . . . . . . . . . . . . . . . . . . . . 4
2.3. Item URI . . . . . . . . . . . . . . . . . . . . . . . . . 4
3. Link Relation Types . . . . . . . . . . . . . . . . . . . . . 5
4. Media Type Definitions . . . . . . . . . . . . . . . . . . . . 5
4.1. Node Representation . . . . . . . . . . . . . . . . . . . 5
4.2. Meta-Data Representation . . . . . . . . . . . . . . . . . 7
4.3. Item Representation . . . . . . . . . . . . . . . . . . . 7
5. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
6. Implementation Considerations . . . . . . . . . . . . . . . . 14
7. Security Considerations . . . . . . . . . . . . . . . . . . . 14
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 14
9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 14
10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 14
10.1. Normative References . . . . . . . . . . . . . . . . . . . 14
10.2. Informative References . . . . . . . . . . . . . . . . . . 15
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 15
Hartke Expires August 3, 2012 [Page 2]
Internet-Draft CoAP REST API for XMPP PubSub January 2012
1. Introduction
This document defines a REST API that enables Constrained Application
Protocol (CoAP) [I-D.ietf-core-coap] clients to interact with
Extensible Messaging Protocol (XMPP) [RFC6120] Publish-Subscribe
[XEP-0060] services. The task of creating, retrieving, updating and
deleting pubsub items and nodes is delegated to a CoAP/XMPP proxy.
Publish-Subscribe enables XMPP entities to create nodes at a pubsub
service and publish information at those nodes; an event notification
(with or without payload) is then broadcasted to all entities that
have subscribed to the node. Nodes and published information can be
identified by Uniform Resource Identifiers (URIs) [RFC3986] using the
'xmpp.pubsub' URI scheme [XEP-xxxx].
The REST API defined in this document consists of the following
elements:
o the Constrained Application Protocol (CoAP) [I-D.ietf-core-coap]
[I-D.ietf-core-observe];
o the 'xmpp.pubsub' URI scheme [XEP-xxxx];
o the representation formats described in this document; and
o the link relation types defined in [RFC5988] and in this document.
This document assumes that the reader is familiar with the terms and
concepts of [REST], [I-D.ietf-core-coap] and [XEP-0060].
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in [RFC2119].
2. Protocol and Scheme
The Constrained Application Protocol (CoAP) allows clients to specify
an arbitrary absolute URI in requests to CoAP proxies. This section
defines what it means to perform a CoAP request on an 'xmpp.pubsub'
URI, i.e. an URI that identifies a node in the context of a pubsub
service or an item in the scope of such a node.
If a CoAP request contains a Proxy-URI Option with an 'xmpp.pubsub'
URI, then the receiving CoAP end-point (called "the proxy"
henceforth) is requested to perform the operation specified by the
request method on the indicated pubsub node or item and return the
result of the operation to the client.
Hartke Expires August 3, 2012 [Page 3]
Internet-Draft CoAP REST API for XMPP PubSub January 2012
How the proxy actually satisfies the request is an implementation
detail, although the typical case is expected to be the proxy
reconstructing the encapsulated XMPP address from the URI, connecting
to an appropriate XMPP server, and sending an appropriate XMPP
"stanza" (XML fragment) to the XMPP address. Some implementation
considerations for this case are outlined in Section 6.
2.1. Node URI
For a URI of the form xmpp.pubsub:[//
authority/][localpart@]domainpart/[nodeid/], the following methods
have the following meaning:
GET The GET method requests the proxy to return a current
representation of the pubsub node identified by the request
URI.
POST The POST method requests the proxy to publish the enclosed
representation as new pubsub item to the pubsub node
identified by the request URI.
DELETE The DELETE method requests the proxy to delete the pubsub
node identified by the request URI, including all published
items within the scope of the node.
2.2. Node Meta-Data URI
For a URI of the form xmpp.pubsub:[//
authority/][localpart@]domainpart/[nodeid/]?meta-data, the following
methods have the following meaning:
GET The GET method requests the proxy to return a current
representation of the node meta-data identified by the
request URI.
2.3. Item URI
For a URI of the form xmpp.pubsub:[//
authority/][localpart@]domainpart/nodeid/itemid, the following
methods have the following meaning:
GET The GET method requests the proxy to return a current
representation of the pubsub item identified by the request
URI.
Hartke Expires August 3, 2012 [Page 4]
Internet-Draft CoAP REST API for XMPP PubSub January 2012
PUT The PUT method requests the proxy to update or create the
pubsub item identified by the request URI with the enclosed
representation.
DELETE The DELETE method requests the proxy to delete the pubsub
item identified by the request URI.
3. Link Relation Types
This specification adds the following values to the Link Relation
Type registry of [RFC5988]:
create Indicates that the link's context is a collection of
resources, and refers to a resource that can be used to
create new resources within the link's context.
update Refers to a resource that can be used to update the link's
context.
delete Refers to a resource that can be used to delete the link's
context.
item Refers to a resource in a collection of resources.
meta Refers to a resource containing meta-data for the link's
context.
4. Media Type Definitions
4.1. Node Representation
A node is represented in the CoRE Link Format
[I-D.ietf-core-link-format].
The representation SHOULD include, but is not restricted to, the
following links:
o A link with a relation of "create", if the node supports item
publication.
o A link with a relation of "delete", if the node can be deleted.
o A link with a relation of "meta", if the node has meta-data.
o A link with a relation of "last", if the node is a leaf node and
has at least one published item.
Hartke Expires August 3, 2012 [Page 5]
Internet-Draft CoAP REST API for XMPP PubSub January 2012
o A link with a relation of "item" for each published item, if the
node is a leaf node.
o A link with a relation of "related" for each child node, if the
node is a collection node (see [XEP-0163]).
Figure 1 shows the representation of an example root node with URI
<xmpp.pubsub:pubsub.shakespeare.lit/>. The representation includes
links to all first-level nodes of the pubsub service.
<blogs/>; rel="related"; title="Weblog updates",
<news/>; rel="related"; title="News and announcements"
Figure 1: Representation of a root node
Figure 2 shows the representation of an example collection node with
URI <xmpp.pubsub:pubsub.shakespeare.lit/blogs/>. The representation
includes links to second-level nodes.
<../princely_musings/>; rel="related",
<../kingly_ravings/>; rel="related",
<../starcrossed_stories/>; rel="related",
<../moorish_meanderings/>; rel="related"
Figure 2: Representation of a collection node
Figure 3 shows the representation of an example leaf node with URI
<xmpp.pubsub:pubsub.shakespeare.lit/princely_musings/>. The
representation consists of a link to a resource containing the node's
meta-data, a link to a resource containing the last item published to
the node, a link to a resource that can be used to publish new items,
a link to a resource that can be used to delete the node, and four
links to resources containing published items in the context of the
node.
<?meta-data>; rel="meta",
<?last-item>; rel="last",
<>; rel="create",
<>; rel="delete",
<368866411b877c30064a5f62b917cffe>; rel="item",
<3300659945416e274474e469a1f0154c>; rel="item",
<4e30f35051b7b8b42abe083742187228>; rel="item",
<ae890ac52d0df67ed7cfdf51b644e901>; rel="item"
Figure 3: Representation of a leaf node
Hartke Expires August 3, 2012 [Page 6]
Internet-Draft CoAP REST API for XMPP PubSub January 2012
4.2. Meta-Data Representation
Node meta-data is represented in Turtle [W3C.SUBM-turtle-20110328].
The representation makes statements about a pubsub node using a set
predicates derived from the "pubsub#meta-data" FORM_TYPE defined in
[XEP-0060]. The predicates are obtained by prefixing each form field
name with the string "http://jabber.org/protocol/". For example, the
predicate that indicates the name of a node (form field "pubsub#
title") is "http://jabber.org/protocol/pubsub#title".
Figure 4 shows the representation of example meta-data for the node
identified by the URI <xmpp.pubsub:pubsub.shakespeare.lit/
princely_musings/>.
@prefix p: <http://jabber.org/protocol/pubsub#> .
<xmpp.pubsub:pubsub.shakespeare.lit/princely_musings/>
p:type "http://www.w3.org/2005/Atom";
p:creator <xmpp:hamlet@denmark.lit>;
p:creation_date "2003-07-29T22:56Z";
p:title "Princely Musings (Atom)"@en;
p:description "Hamlet's Princely Musings weblog."@en;
p:language "en";
p:contact <xmpp:bard@shakespeare.lit>;
p:owner <xmpp:hamlet@denmark.lit>;
p:publisher <xmpp:hamlet@denmark.lit>,
<xmpp:horatio@shakespeare.lit>;
p:num_subscribers 1066 .
Figure 4: Representation of meta-data for a node
4.3. Item Representation
A pubsub item is represented in an XML-based document format
[W3C.REC-xml-20081126] with the following properties:
o The document MUST be well-formed.
o This specification does not define a DTD, and hence does not
require the document to be valid (in the sense used by XML).
o For compatibility with XMPP, the document MUST meet the restricted
form of XML defined in Section 11.1 of [RFC6120] (i.e., comments,
processing instructions, DTD subsets and entity references other
than the predefined ones are prohibited).
Hartke Expires August 3, 2012 [Page 7]
Internet-Draft CoAP REST API for XMPP PubSub January 2012
o The pubsub item is the XML fragment consisting of the document's
root element and its content, if any.
An example follows.
<?xml version='1.0'?>
<entry xmlns='http://www.w3.org/2005/Atom'>
<title>Soliloquy</title>
<summary>
To be, or not to be: that is the question:
Whether 'tis nobler in the mind to suffer
The slings and arrows of outrageous fortune,
Or to take arms against a sea of troubles,
And by opposing end them?
</summary>
<link rel='alternate' type='text/html'
href='http://denmark.lit/2003/12/13/atom03'/>
<id>tag:denmark.lit,2003:entry-32397</id>
<published>2003-12-13T18:30:02Z</published>
<updated>2003-12-13T18:30:02Z</updated>
</entry>
Figure 5: Representation of an example item
5. Examples
This section gives a number of short examples with message flows for
CoAP requests with 'xmpp.pubsub' URIs in the Proxy-URI Option.
CoAP CoAP/XMPP
Client Proxy
| |
| |
+----->| Header: GET (T=CON, Code=1, MID=0x7d40)
| GET | Token: 0x75
| | Proxy-URI: "xmpp.pubsub:pubsub.shakespeare.lit/"
| |
| |
|<-----+ Header: 2.05 Content (T=ACK, Code=69, MID=0x7d40)
| 2.05 | Token: 0x75
| |
| | <blogs/>; rel="related"; title="Weblog updates",
| | <news/>; rel="related"; title="News and announcements"
| |
Figure 6: Discover first-level nodes
Hartke Expires August 3, 2012 [Page 8]
Internet-Draft CoAP REST API for XMPP PubSub January 2012
CoAP CoAP/XMPP
Client Proxy
| |
| |
+----->| Header: GET (T=CON, Code=1, MID=0x7d41)
| GET | Token: 0x76
| | Proxy-URI: "xmpp.pubsub:pubsub.shakespeare.lit/blogs/"
| |
| |
|<-----+ Header: 2.05 Content (T=ACK, Code=69, MID=0x7d41)
| 2.05 | Token: 0x76
| |
| | <../princely_musings/>; rel="related",
| | <../kingly_ravings/>; rel="related",
| | <../starcrossed_stories/>; rel="related",
| | <../moorish_meanderings/>; rel="related"
| |
Figure 7: Discover second-level nodes
CoAP CoAP/XMPP
Client Proxy
| |
| |
+----->| Header: GET (T=CON, Code=1, MID=0x7d42)
| GET | Token: 0x77
| | Proxy-URI: "xmpp.pubsub:pubsub.shakespeare.lit/princely_
| | musings/"
| |
| |
|<-----+ Header: 2.05 Content (T=ACK, Code=69, MID=0x7d42)
| 2.05 | Token: 0x77
| |
| | <?meta-data>; rel="meta",
| | <?last-item>; rel="last",
| | <>; rel="create",
| | <>; rel="delete",
| | <368866411b877c30064a5f62b917cffe>; rel="item",
| | <3300659945416e274474e469a1f0154c>; rel="item",
| | <4e30f35051b7b8b42abe083742187228>; rel="item",
| | <ae890ac52d0df67ed7cfdf51b644e901>; rel="item"
| |
Figure 8: Discover Items for a Node
Hartke Expires August 3, 2012 [Page 9]
Internet-Draft CoAP REST API for XMPP PubSub January 2012
CoAP CoAP/XMPP
Client Proxy
| |
| |
+----->| Header: GET (T=CON, Code=1, MID=0x7d43)
| GET | Token: 0x78
| | Proxy-URI: "xmpp.pubsub:pubsub.shakespeare.lit/princely_
| | musings/?meta-data"
| |
| |
|<-----+ Header: 2.05 Content (T=ACK, Code=69, MID=0x7d43)
| 2.05 | Token: 0x78
| |
| | @prefix p: <http://jabber.org/protocol/pubsub#> .
| |
| | <xmpp.pubsub:pubsub.shakespeare.lit/princely_musings/>
| | p:type "http://www.w3.org/2005/Atom";
| | p:creator <xmpp:hamlet@denmark.lit>;
| | p:creation_date "2003-07-29T22:56Z";
| | p:title "Princely Musings (Atom)"@en;
| | p:description "Hamlet's Princely Musings weblog."@en;
| | p:language "en";
| | p:contact <xmpp:bard@shakespeare.lit>;
| | p:owner <xmpp:hamlet@denmark.lit>;
| | p:publisher <xmpp:hamlet@denmark.lit>,
| | <xmpp:horatio@shakespeare.lit>;
| | p:num_subscribers 1066 .
| |
Figure 9: Discover Node Metadata
Hartke Expires August 3, 2012 [Page 10]
Internet-Draft CoAP REST API for XMPP PubSub January 2012
CoAP CoAP/XMPP
Client Proxy
| |
| |
+----->| Header: GET (T=CON, Code=1, MID=0x7d44)
| GET | Token: 0x79
| | Proxy-URI: "xmpp.pubsub:pubsub.shakespeare.lit/princely_
| | musings/368866411b877c30064a5f62b917cffe"
| |
| |
|<-----+ Header: 2.05 Content (T=ACK, Code=69, MID=0x7d44)
| 2.05 | Token: 0x79
| |
| | <?xml version='1.0'?>
| | <entry xmlns='http://www.w3.org/2005/Atom'>
| | <title>The Uses of This World</title>
| | <summary>
| | O, that this too too solid flesh would melt
| | Thaw and resolve itself into a dew!
| | </summary>
| | <link rel='alternate' type='text/html'
| | href='http://denmark.lit/2003/12/13/atom03'/>
| | <id>tag:denmark.lit,2003:entry-32396</id>
| | <published>2003-12-12T17:47:23Z</published>
| | <updated>2003-12-12T17:47:23Z</updated>
| | </entry>
| |
Figure 10: Retrieve Item from a Node
CoAP CoAP/XMPP
Client Proxy
| |
| |
+----->| Header: GET (T=CON, Code=1, MID=0x7d45)
| GET | Token: 0x7A
| | Observe: 0
| | Proxy-URI: "xmpp.pubsub:pubsub.shakespeare.lit/princely_
| | musings/?last-item"
| |
| |
|<-----+ Header: 2.05 Content (T=ACK, Code=69, MID=0x7d45)
| 2.05 | Token: 0x7A
| | Observe: 598345
| |
| | <?xml version='1.0'?>
| | <entry xmlns='http://www.w3.org/2005/Atom'>
Hartke Expires August 3, 2012 [Page 11]
Internet-Draft CoAP REST API for XMPP PubSub January 2012
| | <title>Alone</title>
| | <summary>
| | Now I am alone.
| | O, what a rogue and peasant slave am I!
| | </summary>
| | <link rel='alternate' type='text/html'
| | href='http://denmark.lit/2003/12/13/atom03'/>
| | <id>tag:denmark.lit,2003:entry-32396</id>
| | <published>2003-12-13T11:09:53Z</published>
| | <updated>2003-12-13T11:09:53Z</updated>
| | </entry>
| |
| |
|<-----+ Header: 2.05 Content (T=CON, Code=69, MID=0xad7d)
| 2.05 | Token: 0x7A
| | Observe: 598647
| |
| | <?xml version='1.0'?>
| | <entry xmlns='http://www.w3.org/2005/Atom'>
| | <title>Soliloquy</title>
| | <summary>
| | To be, or not to be: that is the question:
| | Whether 'tis nobler in the mind to suffer
| | The slings and arrows of outrageous fortune,
| | Or to take arms against a sea of troubles,
| | And by opposing end them?
| | </summary>
| | <link rel='alternate' type='text/html'
| | href='http://denmark.lit/2003/12/13/atom03'/>
| | <id>tag:denmark.lit,2003:entry-32397</id>
| | <published>2003-12-13T18:30:02Z</published>
| | <updated>2003-12-13T18:30:02Z</updated>
| | </entry>
| |
| |
+- - ->| Header: (T=ACK, Code=0, MID=0xad7d)
| |
Figure 11: Observing the Most Recent Item
Hartke Expires August 3, 2012 [Page 12]
Internet-Draft CoAP REST API for XMPP PubSub January 2012
CoAP CoAP/XMPP
Client Proxy
| |
| |
+----->| Header: POST (T=CON, Code=2, MID=0x7d46)
| PUT | Token: 0x7B
| | Proxy-URI: "xmpp.pubsub:pubsub.shakespeare.lit/princely_
| | musings/"
| |
| | <?xml version='1.0'?>
| | <entry xmlns='http://www.w3.org/2005/Atom'>
| | <title>Soliloquy</title>
| | <summary>
| | To be, or not to be: that is the question:
| | Whether 'tis nobler in the mind to suffer
| | The slings and arrows of outrageous fortune,
| | Or to take arms against a sea of troubles,
| | And by opposing end them?
| | </summary>
| | <link rel='alternate' type='text/html'
| | href='http://denmark.lit/2003/12/13/atom03'/>
| | <id>tag:denmark.lit,2003:entry-32397</id>
| | <published>2003-12-13T18:30:02Z</published>
| | <updated>2003-12-13T18:30:02Z</updated>
| | </entry>
| |
| |
|<-----+ Header: 2.01 Created (T=ACK, Code=65, MID=0x7d46)
| 2.01 | Token: 0x7B
| |
Figure 12: Publish an Item to a Node
CoAP CoAP/XMPP
Client Proxy
| |
| |
+----->| Header: DELETE (T=CON, Code=2, MID=0x7d47)
|DELETE| Token: 0x7C
| | Proxy-URI: "xmpp.pubsub:pubsub.shakespeare.lit/princely_
| | musings/4e30f35051b7b8b42abe083742187228"
| |
| |
|<-----+ Header: 2.02 Deleted (T=ACK, Code=66, MID=0x7d47)
| 2.02 | Token: 0x7C
| |
Hartke Expires August 3, 2012 [Page 13]
Internet-Draft CoAP REST API for XMPP PubSub January 2012
Figure 13: Delete an Item from a Node
6. Implementation Considerations
(TODO.)
7. Security Considerations
(TODO.)
8. IANA Considerations
The media type "text/turtle" needs to be assigned a numeric
identifier for use with CoAP.
9. Acknowledgements
This work was funded by Intel.
10. References
10.1. Normative References
[I-D.ietf-core-coap]
Shelby, Z., Hartke, K., Bormann, C., and B. Frank,
"Constrained Application Protocol (CoAP)",
draft-ietf-core-coap-08 (work in progress), October 2011.
[I-D.ietf-core-link-format]
Shelby, Z., "CoRE Link Format",
draft-ietf-core-link-format-11 (work in progress),
January 2012.
[I-D.ietf-core-observe]
Hartke, K. and Z. Shelby, "Observing Resources in CoAP",
draft-ietf-core-observe-03 (work in progress),
October 2011.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, March 1997.
[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
Resource Identifier (URI): Generic Syntax", STD 66,
Hartke Expires August 3, 2012 [Page 14]
Internet-Draft CoAP REST API for XMPP PubSub January 2012
RFC 3986, January 2005.
[RFC5988] Nottingham, M., "Web Linking", RFC 5988, October 2010.
[W3C.REC-xml-20081126]
Sperberg-McQueen, C., Yergeau, F., Maler, E., Paoli, J.,
and T. Bray, "Extensible Markup Language (XML) 1.0 (Fifth
Edition)", World Wide Web Consortium Recommendation REC-
xml-20081126, November 2008,
<http://www.w3.org/TR/2008/REC-xml-20081126>.
[W3C.SUBM-turtle-20110328]
Beckett, D. and T. Berners-Lee, "Turtle - Terse RDF Triple
Language", World Wide Web Consortium Team Submission SUBM-
turtle-20110328, March 2011, <http://www.w3.org/
TeamSubmission/2011/SUBM-turtle-20110328>.
[XEP-0060]
Millard, P., Saint-Andre, P., and R. Meijer, "Publish-
Subscribe", XSF XEP 0060, July 2010,
<http://xmpp.org/extensions/xep-0060.html>.
[XEP-xxxx]
Hartke, K., "The 'xmpp.pubsub' URI Scheme", XSF XEP xxxx
(not yet approved), January 2012,
<http://xmpp.org/extensions/inbox/pubsub-uri.html>.
10.2. Informative References
[REST] Fielding, R., "Architectural Styles and the Design of
Network-based Software Architectures", 2000.
[RFC6120] Saint-Andre, P., "Extensible Messaging and Presence
Protocol (XMPP): Core", RFC 6120, March 2011.
[XEP-0163]
Saint-Andre, P. and K. Smith, "Personal Eventing
Protocol", XSF XEP 0163, July 2010,
<http://xmpp.org/extensions/xep-0163.html>.
Hartke Expires August 3, 2012 [Page 15]
Internet-Draft CoAP REST API for XMPP PubSub January 2012
Author's Address
Klaus Hartke
Universitaet Bremen TZI
Postfach 330440
Bremen D-28359
Germany
Phone: +49-421-218-63905
Fax: +49-421-218-7000
Email: hartke@tzi.org
Hartke Expires August 3, 2012 [Page 16]