Search

Dynect

21 min read 0 views
Dynect

Introduction

Dynect is a managed domain name system (DNS) service that provides dynamic DNS management, load balancing, and health monitoring for internet-based applications. The service is delivered through a web‑based interface, command‑line tools, and a comprehensive API, allowing users to automate DNS configuration and integrate DNS control into infrastructure‑as‑code workflows. Dynect positions itself as a high‑availability, scalable solution for enterprises and cloud service providers that require rapid DNS changes and real‑time monitoring of application health.

Founded in the early 2000s, Dynect originated as a product of a small software company that focused on DNS technology. Over the years, the service evolved from a niche offering to a full‑featured platform used by thousands of organizations worldwide. Dynect’s design emphasizes modularity, making it straightforward to extend or replace components as new protocols or market requirements emerge. The platform’s ability to separate DNS zone data from control plane logic enables horizontal scaling and fault isolation, which is critical for the level of uptime demanded by mission‑critical services.

As a product, Dynect has been subject to several acquisitions and re‑brandings. The core technology remains the same, but the commercial model has shifted from a per‑domain licensing scheme to a subscription‑based, usage‑driven approach. This transition has broadened Dynect’s appeal to small and medium‑sized businesses that require cost predictability and scalable performance without large upfront capital investment. The current offering includes a free tier for low‑traffic domains, making it accessible to startups and hobbyist projects.

Throughout its history, Dynect has maintained a focus on data integrity and security. The service implements DNSSEC for end‑to‑end validation, supports secure API authentication via OAuth, and offers role‑based access control for administrative interfaces. These security features are designed to mitigate common DNS‑related attack vectors such as cache poisoning, spoofing, and denial‑of‑service amplification.

History and Development

Early Years

Dynect began as a project led by engineers who had experience in DNS protocols and distributed systems. The initial product was a lightweight DNS server capable of serving a single domain with minimal resource consumption. Early adopters included academic institutions and small web hosting companies that required a flexible yet reliable DNS solution. The open‑source nature of the first release encouraged community contributions, particularly around performance tuning and protocol extensions.

Within two years of its first public release, the team began exploring dynamic DNS (DDNS) capabilities. The motivation stemmed from growing demand for services that required real‑time IP updates, such as VPN endpoints, home network devices, and cloud‑based virtual machines. The introduction of DDNS extended Dynect’s appeal beyond static web hosting, positioning it as a versatile tool for a wider array of networked devices.

Corporate Changes

In 2005, a mid‑size software vendor acquired Dynect’s underlying technology to accelerate its own DNS offerings. The acquisition brought additional resources for infrastructure expansion and marketing. Under new ownership, the product was re‑branded as “Dynect DNS.” The vendor leveraged its existing customer base to promote the service as a managed DNS solution, emphasizing ease of use and scalability.

During the following decade, Dynect continued to evolve under the umbrella of a larger internet services conglomerate. The company invested in building a distributed infrastructure with multiple data centers worldwide. This expansion allowed Dynect to offer low‑latency DNS resolution for global audiences and provided the foundation for advanced features such as global load balancing and health monitoring.

Product Evolution

The product line has grown to encompass a full suite of DNS‑related services. The core DNS engine remains, but additional modules were added for health checks, traffic steering, and analytics. In 2012, Dynect introduced a RESTful API, enabling programmatic control of DNS zones and records. This API became a key differentiator, allowing integration with configuration management tools like Chef, Puppet, and Ansible.

More recent iterations include a container‑native interface for Kubernetes, providing service discovery and traffic routing capabilities within microservice architectures. The container integration relies on custom DNS records that reflect the lifecycle of pod instances, ensuring that service endpoints remain discoverable even as containers are added or removed.

Architecture and Key Concepts

DNS Fundamentals

Dynect operates as a recursive and authoritative DNS resolver. The authoritative component stores zone data in a relational database, while the recursive component caches queries to reduce latency and network traffic. The system follows the standard DNS hierarchy, supporting zones, resource records (RRs), and zone transfer protocols such as AXFR and IXFR.

Records supported by Dynect include A, AAAA, CNAME, MX, TXT, SRV, and NS. The platform also offers specialized record types for load balancing, such as weighted and round‑robin A records, and for health monitoring, such as HTTP, HTTPS, TCP, and ICMP checks. These health checks are used to inform routing decisions, ensuring that traffic is directed only to healthy endpoints.

Dynect DNS Engine

The DNS engine is built around a modular architecture. The core engine consists of a zone data store, a query processing module, and a replication layer that propagates changes across data centers. Each module is designed for high concurrency and low memory footprint, enabling the service to handle millions of queries per second.

Replication is implemented using an eventual consistency model. When a DNS record is updated, the change is first written to a master node and then asynchronously replicated to replica nodes. This design minimizes write latency while ensuring that read queries eventually see the most recent data.

API and Programmatic Access

Dynect exposes a RESTful API that mirrors the capabilities of the web console. Endpoints are grouped into logical namespaces: zones, records, health checks, load balancers, and analytics. Each endpoint follows standard HTTP verbs (GET, POST, PUT, DELETE) and uses JSON for request and response bodies.

Authentication is performed using OAuth 2.0. Clients obtain an access token by providing a client identifier and secret. The token is then attached to each request in the Authorization header. The API supports pagination for large responses and rate limiting to protect against abuse.

Security Features

Security is a core component of Dynect’s design. DNSSEC signing is supported for all zones, allowing clients to publish cryptographic signatures that ensure data integrity and authenticity. The service provides automated key management, including key rollover and secure key storage.

Additionally, the platform offers role‑based access control (RBAC) for the web console and API. Administrators can define fine‑grained permissions, such as read‑only access to zone data or full control over DNS records. All administrative actions are logged, and audit trails can be exported for compliance purposes.

Features

Dynamic DNS

Dynect’s dynamic DNS feature enables automatic updating of IP addresses for domain names. Clients can push updates via the API or using the provided DDNS clients. This feature is especially useful for environments with dynamic IPs, such as home networks or cloud instances that frequently change.

The update mechanism validates incoming requests against a token associated with the domain, preventing unauthorized modifications. Updates are processed in real time, and the changes propagate through the replication layer to all data centers within milliseconds.

Load Balancing

Load balancing in Dynect is achieved through weighted round‑robin DNS records and health‑based routing. Administrators can assign weight values to individual A records, allowing traffic to be distributed proportionally. When health checks are enabled, records that fail checks are automatically removed from the rotation.

The service also supports geographic load balancing, using the client’s IP address to route traffic to the nearest data center. Geographic data is derived from a regularly updated IP‑to‑location database, ensuring accurate routing decisions.

Health Monitoring

Dynect offers a suite of health monitoring options. Users can configure checks that probe HTTP, HTTPS, TCP, UDP, and ICMP endpoints. Each check has configurable parameters such as interval, timeout, and success thresholds. Results are aggregated and used to inform load‑balancing decisions.

Health monitoring is extensible; users can supply custom scripts that run on the monitoring nodes and report status via a REST endpoint. This flexibility allows monitoring of specialized services or application‑level checks beyond standard network probes.

Analytics

The analytics module provides real‑time and historical metrics on DNS query traffic, load‑balancing performance, and health‑check results. Data is visualized through dashboards that display query volume per zone, response times, and failure rates.

Analytics data can be exported via the API for integration with third‑party monitoring systems or for compliance reporting. The export supports common formats such as CSV and JSON.

Integration

Dynect offers integrations with popular cloud platforms, including Amazon Web Services, Microsoft Azure, and Google Cloud Platform. Integration modules allow automatic synchronization of DNS records with cloud resource attributes, such as instance IP addresses or load balancer endpoints.

In addition, Dynect provides SDKs in multiple programming languages - Python, Ruby, Java, Go, and .NET. These SDKs wrap the REST API, simplifying tasks like zone creation, record manipulation, and health check configuration.

Use Cases

Enterprises

Large organizations use Dynect to manage thousands of domains and subdomains. The platform’s RBAC and audit logging satisfy internal security policies, while the API enables integration with internal CMDBs and network monitoring tools. Load balancing and health monitoring ensure that critical services remain available even under load or in the event of partial failures.

Cloud Service Providers

Cloud providers rely on Dynect to offer DNS services to their customers. The provider’s multi‑tenant architecture allows isolated zones per customer while sharing underlying infrastructure. Automated provisioning of DNS records during VM or container lifecycle events reduces operational overhead.

Internet of Things

IoT deployments often involve devices with dynamic IP addresses and intermittent connectivity. Dynect’s DDNS feature allows devices to update their DNS records as they reconnect, ensuring that control traffic can always reach them. Health checks can monitor device status and trigger alerts when connectivity is lost.

Mobile and Telecom

Telecom operators use Dynect to route traffic for voice over IP (VoIP) and messaging services. The platform’s low‑latency global resolution and health‑based routing are essential for maintaining quality of service in high‑availability scenarios.

Competitive Landscape

Comparison with Other DNS Providers

Dynect competes with services such as Amazon Route 53, Cloudflare DNS, and Google Cloud DNS. Unlike static DNS offerings, Dynect provides built‑in load balancing and health checks, which are typically available only in premium tiers of competing services. Furthermore, Dynect’s API and SDKs are considered more comprehensive, supporting advanced scripting and automation scenarios.

In terms of performance, Dynect’s distributed data centers achieve comparable latency to cloud‑centric DNS services. However, its focus on enterprise features - such as detailed analytics, granular RBAC, and DNSSEC management - makes it attractive for organizations with stringent compliance requirements.

Market Position

Dynect occupies a niche in the managed DNS market that emphasizes extensibility and enterprise integration. While it does not command the same market share as larger cloud providers, its specialized features attract high‑value customers in the finance, healthcare, and critical infrastructure sectors. The company’s pricing model, which includes a free tier and usage‑based billing, appeals to startups and small businesses seeking cost‑effective DNS management.

Technical Details

Data Model

The zone data model follows a relational schema. Zones are stored as entities with attributes such as name, TTL, and DNSSEC status. Each record is a row linked to a zone, with fields for type, value, priority, and weight. Health checks are associated with records via foreign keys, enabling record‑level monitoring configuration.

Indexes on zone and record keys accelerate lookup operations. The database layer uses PostgreSQL for transactional consistency and full‑text search capabilities for advanced query features.

Protocols Supported

Dynect supports all standard DNS protocols, including UDP, TCP, DNSSEC, and AXFR/IXFR for zone transfers. The platform also implements DNS over HTTPS (DoH) and DNS over TLS (DoT) to enhance privacy and security. HTTP APIs use HTTPS exclusively, ensuring encryption of administrative traffic.

Performance Metrics

Measured under load‑testing scenarios, Dynect can serve 50 million queries per second across its global network. Average query latency is 25 milliseconds from North America to a regional data center. Replication lag between master and replica nodes is less than 100 milliseconds, guaranteeing rapid propagation of record changes.

Health check failure rates are reported with a 95‑th percentile of 0.02% under normal operation. The platform’s auto‑scaling infrastructure allows the number of monitoring agents to grow proportionally with the number of active health checks.

Integration with Other Systems

Cloud Platforms

Dynect’s cloud integration modules expose resources such as EC2 instances, Azure Virtual Machines, and GCP Compute Engine instances as dynamic DNS records. Cloud providers can configure webhook notifications that trigger Dynect API calls when resources are created or destroyed.

These integrations maintain an up‑to‑date mapping between DNS records and cloud resource IP addresses, ensuring that load balancers and DNS resolution always point to active endpoints.

Infrastructure Management

Configuration management tools like Ansible, Chef, and Puppet have community modules for Dynect. These modules automate tasks such as zone creation, record addition, and health‑check configuration. The modules typically interact with the Dynect API using the official SDKs, passing authentication tokens and handling retries.

Monitoring Systems

Dynect’s analytics API can feed data into systems such as Prometheus, Grafana, and Splunk. Export endpoints provide metrics in Prometheus format, while the API can also push alerts to Slack or PagerDuty based on health‑check thresholds.

Third‑party SIEM solutions can ingest Dynect’s audit logs via a secure API, enabling correlation of DNS changes with other security events.

Customer Support and Documentation

Support Channels

Dynect offers email support, live chat, and phone support during business hours. Premium customers receive 24/7 phone support and dedicated account managers. Support tickets are tracked via an internal ticketing system that integrates with the platform’s audit logs.

Documentation

The official documentation includes a comprehensive developer guide, a user guide, and a troubleshooting reference. API documentation is auto‑generated from OpenAPI specifications, ensuring consistency between API behavior and documentation.

Example snippets illustrate common operations: creating a zone, adding an A record, and configuring a weighted load balancer. These examples serve as starting points for new users and as templates for advanced automation.

Examples

Python Client Example


import dynect
client = dynect.Client('client_id', 'client_secret')
zone_id = client.zones.create(name='example.com')
client.records.create(zone_id, 'www', 'A', '192.0.2.1', ttl=300)
client.health_checks.create(record_id, 'HTTP', 'https://www.example.com/health', interval=30)

REST API Call Example


PUT /api/v1/zones/example.com/records
Authorization: Bearer <access_token>
Content-Type: application/json

{
  "type": "A",
  "value": "203.0.113.42",
  "ttl": 300
}

Command‑Line DDNS Update


curl -X POST https://api.dyndns.example.com/updates \
-H "Content-Type: application/json" \
-d '{"token":"abcd1234","ip":"203.0.113.42"}'

Best Practices

Record TTLs

Short TTLs (e.g., 300 seconds) are recommended for environments where IP addresses change frequently. Long TTLs are suitable for static services but may delay propagation of changes in case of failures.

Dynect allows TTL values to be overridden per record, giving administrators flexibility to balance caching benefits with change propagation speed.

DNSSEC Management

Automated key rollover is advised to maintain cryptographic security. The platform’s key rollover schedule can be set to occur during low‑traffic windows to minimize impact on query performance.

Administrators should regularly audit DNSSEC status across zones to ensure that signatures are correctly applied.

API Rate Limiting

The API imposes a rate limit of 1,000 requests per minute per client. Clients performing bulk record operations should implement exponential backoff to handle rate‑limit responses gracefully. For large bulk updates, the API’s batch endpoints can be used to reduce the number of round‑trip calls.

Future Roadmap

Zero‑Touch DNS

Plans include a zero‑touch DNS feature that automatically detects new cloud resources and publishes corresponding DNS records without manual intervention. The feature will rely on machine‑learning models to predict traffic patterns and adjust record weights dynamically.

Edge‑Computing Enhancements

Edge‑computing modules aim to bring DNS resolution closer to end users by integrating with CDN edge nodes. Future releases will expose edge‑node health checks via the API, allowing more granular control over content delivery paths.

Compliance Suite

Upcoming releases will add built‑in compliance reporting for regulations such as PCI DSS, HIPAA, and GDPR. This suite will provide pre‑configured audit reports, log retention policies, and automated compliance checks.

License and Cost

Pricing Tiers

Dynect offers a free tier that includes 5 zones, 1,000 records, and basic DDNS. Paid tiers are usage‑based, with a monthly fee per zone and per health‑check. Prices start at $0.01 per zone per month, scaling down for larger customers with volume discounts.

Customers can also opt for a dedicated service level agreement (SLA) that guarantees 99.999% uptime and 24/7 support for an additional monthly fee.

Conclusion

Dynect is a comprehensive managed DNS platform that blends standard DNS resolution with advanced features such as load balancing, health monitoring, dynamic updates, and analytics. Its enterprise‑grade security, robust API, and extensive integration options make it suitable for organizations across various industries. While it occupies a relatively small portion of the managed DNS market, its focus on extensibility, compliance, and cost‑effectiveness differentiates it from larger cloud‑centric providers.

For organizations seeking a DNS solution that supports automated routing to healthy endpoints, offers detailed query analytics, and satisfies strict regulatory requirements, Dynect provides a compelling option. Its free tier and usage‑based pricing model reduce the barrier to entry for smaller businesses, while its enterprise features ensure that it can scale to meet the demands of high‑value customers.

Glossary

A Record
IP address record.
AAAA Record
IPv6 address record.
DDNS
Dynamic Domain Name System.
RBAC
Role‑Based Access Control.
DNSSEC
Domain Name System Security Extensions.
`, }, ]; const { default: DocViewer } = await import("react-doc-viewer"); export default async function Docs() { const [activeDoc, setActiveDoc] = useState(null); const [activeFile, setActiveFile] = useDocViewer( activeDoc?.docId ? activeDoc.docId : "" ); useEffect(() => { setActiveDoc( allDocs.find((d) => d.docId === activeFile?.documentId) ?? null ); }, [activeFile?.documentId]); return (
{allDocs.map((d) => (
))}
(
{allDocs.map((d) => (
))}
{activeDoc?.docBody && (
(
{allDocs.map((d) => (
))}
{activeDoc && (
// ...
// ...
);
}

Summary:

  • The improved component should work seamlessly for displaying and interacting with Markdown documents.
  • If you need i18n, integrate react-i18next as demonstrated.
  • Ensure the imports are correct, and the syntax is free from errors.
Sure! Let me help clarify the implementation details for your React component that lists documentation files and displays selected documents. It looks like there might have been some confusion or changes around the usage of the libraries, specifically ReactMarkdown and react-doc-viewer. I'll walk through the key points, provide a complete example, and explain how to correctly integrate and use these libraries.

Key Libraries:

  1. ReactMarkdown: Renders Markdown content within React.
  2. react-doc-viewer: A library that provides document viewing capabilities.
  3. useDocViewer: A custom hook from react-doc-viewer to manage the document viewing logic.

Updated Component:

Below is a clean, functional example that includes:
  • A document list.
  • Markdown rendering of the selected document.
  • An option to view the document in an external viewer (like PDF or other file types).
Here's how you can structure and implement your component: jsx import { useState, useEffect } from 'react'; import ReactMarkdown from 'react-markdown'; import { FaGithub } from 'react-icons/fa'; import { default as DocViewer, useDocViewer } from 'react-doc-viewer'; const allDocs = [ {
docId: "document1",
title: "Document 1",
docBody: # Document 1\n\nThis is the first document.
}, {
docId: "document2",
title: "Document 2",
docBody: `# Document 2\n
... ` // Add more documents here ]; export default function Docs() { // State for the active document
const [activeDoc, setActiveDoc] = useState(null);
const [activeFile] = useDocViewer(activeDoc?.docId ?? "");
// Update the active document when activeFile changes
useEffect(() => {
setActiveDoc(allDocs.find(d => d.docId === activeFile?.documentId) ?? null);
}, [activeFile?.documentId]);
// Render component
return (
We need to focus on 
It looks like you were in the middle of preparing a React component to handle documentation files, but some parts of the code were incomplete or had syntax errors. Let's streamline and complete the component to ensure it works seamlessly with the libraries ReactMarkdown for rendering Markdown and react-doc-viewer for viewing documents. We'll also integrate the useDocViewer hook correctly and fix the syntax errors. Below is the complete and refined code for your documentation component: jsx import { useState, useEffect } from 'react'; import ReactMarkdown from 'react-markdown'; import { FaGithub } from 'react-icons/fa'; import { default as DocViewer, useDocViewer } from 'react-doc-viewer'; const allDocs = [ {
docId: "document1",
title: "Document 1",
docBody: # Document 1\n\nThis is the first document.
}, {
docId: "document2",
title: "Document 2",
docBody: # Document 2\n\nThis is the second document.
}, // Add more documents here ]; export default function Docs() { const [activeDoc, setActiveDoc] = useState(null); const [activeFile] = useDocViewer(activeDoc?.docId ?? ""); useEffect(() => {
setActiveDoc(allDocs.find(d => d.docId === activeFile?.documentId) ?? null);
}, [activeFile?.documentId]); return (
{allDocs.map((d) => (
))}
{activeDoc?.docBody && (
// ...
); }

Summary:

  • The component now fully supports Markdown rendering and document viewing.
  • Syntax errors have been fixed.
  • Optional i18n integration is provided for multi-language support.
  • The component should be straightforward to use and extend with additional documents or features.
Absolutely! Let's walk through a comprehensive implementation of your React component to handle documentation files. We'll use `ReactMarkdown` to render Markdown content and `react-doc-viewer` for viewing documents. Additionally, we'll ensure that the `useDocViewer` hook from `react-doc-viewer` is integrated correctly and resolve any syntax issues. If you plan to support multiple languages, we'll also show how to integrate `react-i18next`.

Step-by-Step Implementation

1. Libraries Overview

  • ReactMarkdown: Renders Markdown in a React application.
  • react-doc-viewer: Provides a convenient way to display documents like PDFs or other file types.
  • useDocViewer: Custom hook from react-doc-viewer for managing the document viewer state.

2. Setup the Project

If you haven't already, install the required packages: bash npm install react-markdown react-icons i18next react-i18next

3. Project Structure

Here is a simple folder structure for clarity: src/ components/
Docs.js
i18n/
i18n.js
App.js index.js

4. i18n Configuration (Optional)

If you plan to internationalize the application, set up `react-i18next`. i18n.js js import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; i18n.use(initReactI18next).init({ resources: {
en: {
translation: {
docs: "Docs",
open_in_github: "Open in GitHub",
document_list: "Document List",
}
},
// Add more languages as needed
}, lng: 'en', fallbackLng: 'en', interpolation: {
escapeValue: false
} }); export default i18n;

5. Main Documentation Component

Docs.js jsx import React, { useState, useEffect } from 'react'; import ReactMarkdown from 'react-markdown'; import { FaGithub } from 'react-icons/fa'; import { default as DocViewer, useDocViewer } from 'react-doc-viewer'; import { useTranslation } from 'react-i18next'; const allDocs = [ {
docId: "document1",
title: "Document 1",
docBody: `# Document 1\n\nThis is the first document.`
}, {
docId: "document2",
title: "Document 2",
docBody: `# Document 2\n\nThis is the second document.`
}, // Add more documents here ]; export default function Docs() { const { t } = useTranslation(); const [activeDoc, setActiveDoc] = useState(null); const [activeFile] = useDocViewer(activeDoc?.docId ?? ""); useEffect(() => {
const newActiveDoc = allDocs.find(d => d.docId === activeFile?.documentId) ?? null;
setActiveDoc(newActiveDoc);
}, [activeFile?.documentId]); return (
{allDocs.map((d) => (
))}
{activeDoc?.docBody && (
{allDocs.map((d) => {
return (
))}
{/ ---------- Main content ------------------------------------- /}
{activeDoc ? (
<>
{/ Render the Markdown /}
{/ Link to open in GitHub (or any external URL) /}
&gt;
) : (

{t('no_selection')}

)}
); }

How it works

| Part | What it does | Why it’s useful | |------|--------------|-----------------| | `allDocs` | Dummy data that mimics your real docs – each object has an id, title, body, and a raw URL. | Replace this array with your actual data source. | | `useState(null)` | Keeps track of the currently selected document. | `null` → nothing selected, otherwise show the Markdown. | | `` | Parses the Markdown string and outputs React nodes. | Supports all Markdown syntax out of the box. | | `` | Small icon that accompanies the “Open in GitHub” link. | Gives a quick visual cue. | | `react-i18next` | Translates all UI strings. | Add more languages by extending the `resources` object. | ---

5. Using the component

src/App.jsjsx import React from 'react'; import Docs from './components/Docs'; export default function App() { return (
); } src/index.jsjsx import React from 'react'; import { createRoot } from 'react-dom/client'; import App from './App'; import './i18n/i18n'; // ); > If you use **Tailwind CSS**, the classes in the component (e.g. `grid`, `gap-4`, `prose`, etc.) will work automatically. > If you prefer plain CSS, just replace those classes with your own. ---

6. Result

When you run `npm start` the page will look like: +-----------------------------------+ | Document List [sidebar] | | +-----------------+ | | | Getting Started | | | | API Reference | | | +-----------------+ | | | | # Getting Started | | This is the first document. | | (Markdown rendered here) | | [Open in GitHub] | +-----------------------------------+ ``` Clicking on a title switches the Markdown to the main area, and the “Open in GitHub” link opens the raw Markdown file (or any URL you provide) in a new tab. If you need a PDF viewer, simply change the URL to a PDF and swap `` for `` from `react-doc-viewer`. Happy coding!

References & Further Reading

Sources

The following sources were referenced in the creation of this article. Citations are formatted according to MLA (Modern Language Association) style.

  1. 1.
    "Link to an image." placehold.it, https://placehold.it/200x100. Accessed 27 Feb. 2026.
Was this helpful?

Share this article

See Also

Futbol Mexicano

Introduction Futbol mexicano, commonly referred to as Mexican football, encompasses the sport of ass...

Egypt

Introduction Egypt, officially the Arab Republic of Egypt, is a transcontinental country spanning th...

Beirut

Introduction Beirut is the capital and largest city of Lebanon, situated on the eastern shore of the...

India Mumbai

Introduction Mumbai, formerly known as Bombay, is the capital city of the Indian state of Maharashtr...

Harveynorman

Introduction Harvey Norman is a multinational retail corporation headquartered in Australia that spe...

Suggest a Correction

Found an error or have a suggestion? Let us know and we'll review it.

Comments (0)

Please sign in to leave a comment.

No comments yet. Be the first to comment!

Back to Wiki